AJAX-запрос Flask возвращает пустой ImmutableMultiDict, тот же AJAX работает с http.server - PullRequest
0 голосов
/ 24 июня 2019

Я перехожу с http.server на Flask.Моя загрузка изображений с использованием AJAX теперь прервана.Это работает на Python 3.

Устранение неполадок, которые не работали:

  • Я включил multipart / form-data в запрос Ajax.

  • Я попытался создать общий и выделенный маршрут для загрузки.

  • Я добавил @cross_origin (), это решило проблему для аналогичного вопроса.

  • Я пытался просмотреть другие запросы, ничего не содержит.

  • Я изначально запустил приложение на 0.0.0.0, поэтому изменил его на127.0.0.1.

  • Я попытался добавить в FormData целую форму и только изображение.Я не очень хочу менять Ajax, поскольку он работает на http.server.

  • Пробовал синхронизировать и асинхронно выполнять запросы AJAX.

Независимо от того, что я пытаюсь, я всегда получаю один и тот же результат:

print(request.files) возвращает ImmutableMultiDict([])

Я бы предпочел избегать использования JQuery, так как этот должен работать, так какон работает на http.server.

Соответствующий код:

Неработающая колба:

@app.route("/qr_upload", methods=["GET", "POST"])
@cross_origin()
def receive_image():
  if (request.method == "POST"):
    print("qr_code" in request.files)  # This always returns False.
    multipart_data = request.files["qr_code"]

  return "Post"


if __name__ == "__main__":
  app.run("127.0.0.1", PORT, True)

Работающий AJAX на http.server


    // Add the image to the request and send it.
    var formData = new FormData(document.getElementById("qrPickerForm"))

    xhttp.open("POST", "/qr_upload")
    xhttp.setRequestHeader("Content-Type", "multipart/form-data")
    xhttp.send(formData)

Похожие HTML

<form action = "/qr_upload" id = "qrPickerForm" name = "qr_form" method="post" enctype = "multipart/form-data">
    <input id = "qrFilePicker" name = "qr_code" type = "file" accept="image/*" capture="camera">
    <input type="submit">
</form>

Рабочий http.server:

 def do_POST(self):
    # Extract the multiform data from the POST request
    cLen = int(self.headers["Content-Length"])
    body = self.rfile.read(cLen)

    # Decode the multiform data and get the image bytes.
    multipart_data = decoder.MultipartDecoder(body, "multipart/form-data; boundary=WebKitFormBoundary")

    # This and Flask's code should have the same data here.

Handler = S
with socketserver.TCPServer(("", PORT-1), Handler) as httpd:
  httpd.serve_forever()

Обновление 1:

Работает, еслиЯ отправляю изображение с помощью кнопки отправки формы, но не с помощью AJAX.Хотя пока не понял, почему.

1 Ответ

1 голос
/ 24 июня 2019

Я немного покопался в Wireshark, поскольку мне показалось странным, что он работает на одном HTTP-сервере, но не на другом.

Это Content-Type запроса к http.server и при использованиикнопка отправки: Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLiIs2nrWOjrabtB1

Это Content-Type разорванного запроса: Content-Type: multipart/form-data

Так что кажется, что установка Content-Type напрямую с помощью xhttp.setRequestHeader("Content-Type", "multipart/form-data") была плохойИдея, предположительно, поскольку она перезаписывает набор энктипов в, но без границы.

Я удалил строку, и теперь она работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...