Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Flask AJAX请求返回空的ImmutableMultiDict,相同的AJAX可用于http.server_Javascript_Python_Ajax_Flask - Fatal编程技术网

Javascript Flask AJAX请求返回空的ImmutableMultiDict,相同的AJAX可用于http.server

Javascript Flask AJAX请求返回空的ImmutableMultiDict,相同的AJAX可用于http.server,javascript,python,ajax,flask,Javascript,Python,Ajax,Flask,我正在从http.server转换到Flask。我使用AJAX上传的图像现在已损坏。这是在运行Python3 故障排除不起作用: 我已经在Ajax请求中包含了多部分/表单数据 我已经尝试了一个共享和专用的上传路线 我添加了@cross_origin(),它解决了类似问题的问题 我试着在其他请求中查找,没有包含任何内容 我最初在0.0.0.0上运行该应用程序,因此将其更改为127.0.0.1 我尝试将整个表单添加到FormData中,只添加图像。我不愿意对Ajax做更多的更改,因为它可以在htt

我正在从http.server转换到Flask。我使用AJAX上传的图像现在已损坏。这是在运行Python3

故障排除不起作用:

  • 我已经在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\u upload”,方法=[“GET”,“POST”])
@交叉起源()
def接收_图像():
如果(request.method==“POST”):
打印(request.files中的“qr_代码”)#这总是返回False。
多部分数据=请求文件[“qr\U代码”]
返回“Post”
如果名称=“\uuuuu main\uuuuuuuu”:
应用程序运行(“127.0.0.1”,端口,真实)
在http.server上使用AJAX


    // 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


正在工作的http.server:

def do_POST(self):
#从POST请求中提取多种形式的数据
cLen=int(self.headers[“内容长度”])
body=self.rfile.read(cLen)
#对各种形式的数据进行解码,得到图像字节。
多部分数据=解码器。多部分解码器(正文,“多部分/表单数据;边界=WebKitFormBoundary”)
#这和Flask的代码在这里应该有相同的数据。
Handler=S
将socketserver.TCPServer((“”,端口-1),处理程序)作为httpd:
httpd.永远为你服务()
更新1:


如果我使用表单的提交按钮发送图像,它就可以工作,但不使用AJAX。但我还没有弄明白原因。

我在Wireshark中翻了一番,因为它在一个HTTP服务器上工作,而在另一个HTTP服务器上工作,这让我觉得很奇怪

这是对http.server的请求的内容类型,在使用“提交”按钮时:
内容类型:多部分/表单数据;边界=----WebKitFormBoundaryLiis2nrOjRabtb1

这是中断请求的内容类型:
内容类型:多部分/表单数据

因此,似乎直接使用
xhttp.setRequestHeader(“内容类型”、“多部分/表单数据”)
设置内容类型是个坏主意,可能是因为它覆盖了中设置的enctype,但没有边界


我删除了该行,现在它可以正常工作。

可能是@KateOrlova的副本,但我没有运行JQuery?好的,@Fivreld。您的表单是否具有
enctype=“多部分/表单数据”
属性?我希望这样做,否则文件将是空的。@KateOrlova这
xhttp.setRequestHeader(“内容类型”,“多部分/表单数据”)
就足够了吗?不,不够。这应该在HTML视图中为您的
标记指定,请检查您的表单定义。非常好,@Fivreld,我很高兴您找到了解决方案!谢谢我对jQuery也有同样的问题
$.ajax({contentType:'multipart/form data'})
错误,而
$.ajax({contentType:false})
有效。