【发布时间】:2020-10-27 18:19:43
【问题描述】:
我有一个问题。我编写了一些混合 Javascript 和 Python 的代码。这个想法是我将文件拖放到画布中,然后将 Ajax 请求发送到在线程中本地运行的 python 服务器。
基本上,Javascript 部分如下所示:
$(document).on('drop', '#canvas', function(e) {
if(e.originalEvent.dataTransfer) {
var files = e.originalEvent.dataTransfer.files,
formData = new FormData(),
xhr = new XMLHttpRequest();
// main function here
xhr.open("POST", 'http://localhost:8001/upload_images.py', true)
xhr.send(formData)
后端只是一个pythonSimpleHttpServer:
class FileUploadHTTPRequestHandler(SimpleHTTPRequestHandler):
protocol_version = "HTTP/1.1"
def end_headers(self):
# overwrite SimpleHTTPRequestHandler to handle CORS policy
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header("Access-Control-Allow-Headers", "*")
self.send_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
BaseHTTPRequestHandler.end_headers(self)
def do_POST(self):
"""Handle a POST request."""
# main code here
self.send_response(200)
self.send_header("Content-type", "Application/json")
self.send_header("Content-Length", len(response_str))
self.end_headers()
self.wfile.write(response_str.encode('utf-8'))
def do_OPTIONS(self):
# handle Pre-flight
self.send_response(200, "ok")
# call our own end_headers to handle pre-flight
self.end_headers()
事情是这样的。当我使用 google chrome 在 Windows 10 上运行此代码时,一切正常。我可以看到从我的 Javascript 发送的 POST 请求首先在我的 python 服务器(飞行前)中作为 OPTIONS 接收,然后才是真正的 POST 请求被执行,一切正常,我的图像显示在我的画布中
另一方面,现在我已经使用 Chromium/Chrome 将我的工作代码放在 Ubuntu 上......该代码不再工作了。我的 Javascript 中的 POST 已发送。它仍然在我的 python 服务器中作为 OPTIONS 接收,但它从未从我的 python 服务器进入我的 do_POST。
在 Ubuntu 下的 chrome 调试器中,在网络下,我可以看到“警告:请求尚未完成”。所以看起来 do_OPTIONS 响应首先没有被 Javascript 收到,我的请求仍然悬而未决......
我迷路了。我不明白为什么它适用于 Windows+google chrome 但不适用于 Ubuntu+chrome...
注意: 我试过改变端口,改变“end_headers()”和很多其他的东西,但我可以让它工作......
我希望有人已经遇到过这个问题。
编辑:在两台机器上调试时。我注意到,在 Ubuntu 上,代码在来自 http 库的 server.py 的 handle_one_request(self) 中崩溃。
线路:self.raw_requestline = self.rfile.readline(65337) 是错误线路...
【问题讨论】:
标签: javascript python server