Python服务器没有响应(CORS策略?)

2024-04-25 19:12:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个问题。我编写了一些混合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)

后端只是一个python SimpleHttpServer

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()

事情是这样的。当我使用谷歌chrome在Windows 10上运行这段代码时,一切正常。我可以看到,从Javascript发送的POST请求首先作为python服务器(飞行前)中的选项被接收,然后执行真正的POST请求,一切正常,我的图像显示在画布中

另一方面,现在我已经用Chrome/Chrome将我的工作代码放在Ubuntu上了。。。代码不再工作了。发送来自我的Javascript的帖子。它在我的python服务器中仍然作为一个选项接收,但是它从未从我的python服务器进入我的do_POST

在Ubuntu下的chrome调试器中,在网络下,我可以看到“警告:请求尚未完成”。所以看起来Javascript从一开始就没有收到do_OPTIONS响应,我的请求仍然悬而未决

我迷路了。我不明白为什么它可以在Windows+GoogleChrome上运行,但不能在Ubuntu+chrome上运行

注: 我尝试过改变端口,改变“end_headers()”和其他很多东西,但我可以让它工作

我希望有人已经遇到了这个问题

编辑:在两台计算机上调试时。我注意到,在Ubuntu上,代码在http库的handle_one_request(self)from server.py中崩溃

行:self.raw_requestline = self.rfile.readline(65337)是有故障的一行


Tags: 代码self服务器sendresponseubuntudefjavascript
1条回答
网友
1楼 · 发布于 2024-04-25 19:12:02

所以,我终于成功了

正如您在我的原始帖子中所看到的,我的课程从以下内容开始:

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

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

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

我在互联网上搜索了一下,但没有找到解释,比如为什么预先设定HTTP协议版本会对代码产生如此大的影响。。。如果有人知道HTTP协议版本的精确与否对代码的影响,我很乐意知道

相关问题 更多 >