【问题标题】:Python server not responding (CORS policy?)Python 服务器没有响应(CORS 策略?)
【发布时间】: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


    【解决方案1】:

    所以,我终于成功了!

    正如你在我原来的帖子中看到的那样,我的课程开始于:

    class FileUploadHTTPRequestHandler(SimpleHTTPRequestHandler):
        protocol_version = "HTTP/1.1"
        ...
    

    实际上,如果您删除 protocol_version = "HTTP/1.1 类属性,那么它就可以工作了。我不确定为什么它在 WIndows + Chrome 上运行良好,但在 Ubuntu + Chrome 上却不行

    注意:两个操作系统上的 Chrome 版本相似

    我在互联网上搜索了一下,但没有找到解释为什么精确 HTTP 协议版本会影响代码...如果有人知道精确或不精确 HTTP 协议版本如何影响代码,我会很高兴了解

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2020-11-21
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2019-05-28
      • 1970-01-01
      • 2021-10-13
      相关资源
      最近更新 更多