Javascript Flask AJAX请求返回空的ImmutableMultiDict,相同的AJAX可用于http.server
我正在从http.server转换到Flask。我使用AJAX上传的图像现在已损坏。这是在运行Python3 故障排除不起作用: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
- 我已经在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})
有效。