【问题标题】:Error: No 'Access-Control-Allow-Origin' header in a Python web server错误:Python Web 服务器中没有“Access-Control-Allow-Origin”标头
【发布时间】:2017-09-05 03:46:08
【问题描述】:

我有一个基于 HTTPServer 的 python web 服务器的问题:

简介: 我有一个摄像头系统:每台计算机中有 2 个。每台计算机都有他的 python web 服务器来管理相机设置。相机设置存储在 xml 文件中。 然后我有另一台带有软件(在 python 中)的计算机来管理来自相机的数据。此外,该软件在 xml 中有一个设置文件,在 python 中有一个 Web 服务器

问题: 我在 html/jquery 中做了一个向服务器发送请求的接口。 问题是当我从位于另一台服务器中的页面向位于“相机计算机”中的服务器发送 Ajax 请求以获取 xml 文件时。

这是 AJAX 请求:

$.ajax({
        type: "GET",
        url: "http://"+ipCompleto+":8081/"+$(this).attr("port")+"/default.xml",
        dataType: "xml",
        success: function(xml){

            bordoBlob = $(xml).find('dimBordoBlob').text();
            blobSize = $(xml).find('blobSize').text();
            hMin = $(xml).find('intval1').text();
            hMax = $(xml).find('intval2').text();
            $("#inputHMax").val(hMax);
            $("#titoloHMax").text(hMax);
            $("#inputHMin").val(hMin);
            $("#titoloHMin").text(hMin);
            $("#minBlobSizeValue").val(blobSize);
            $("#minBlobSizeTitle").text(blobSize);
            $("#blobBorderSizeValue").val(blobSize);
            $("#blobBorderSizeTitle").text(blobSize);   
        },
        error: function() {
            alert("An error occurred while processing XML file.");
        }       
    });

这是服务器:

#!/usr/bin/env python
from http.server import BaseHTTPRequestHandler, HTTPServer
from xml.dom import minidom
import os
import time
from stat import *
class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.data_string = self.rfile.read(int(self.headers['Content-Length']))
        self.send_response(200)
        self.end_headers()
        valore = str(self.data_string)[2:-1]
        response = ["",""]
        response[0],response[1] = processData(valore)
        if response[0] == 1:
            sep = ""
            message = ""
            for res in response[1]:
                message += res
            response = sep.join(message)
            self.wfile.write(bytes(message, "utf-8"))

    def do_GET(self):
        # Send response status code
        self.send_response(200)
        self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')
        # Send headers
        if self.path.endswith("html"):
            self.send_header('Content-type', 'text/html')
            self.end_headers()
        elif self.path.endswith("css"):
            self.send_header('Content-type', 'text/css')
            self.end_headers()
        elif self.path.endswith("xml"):
            self.send_header('Content-type', 'text/xml')
            self.end_headers()
        elif self.path.endswith("js"):
            self.send_header('Content-type', 'application/javascript')
            self.end_headers()
        if not self.path.endswith("jpeg") and not self.path.endswith("jpg") and not self.path.endswith("png") and not self.path.endswith("gif"):
            with open(self.path[1:], 'r') as myfile:
                data = myfile.read()
            # Write content as utf-8 data
            self.wfile.write(bytes(data, "utf8"))
        if self.path.endswith("jpeg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.send_header('Cache-Control', 'no-store')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("png"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/png')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("gif"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/gif')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        elif self.path.endswith("jpg"):
            f = open(self.path[1:], 'rb')
            self.send_response(200)
            self.send_header('Content-type', 'image/jpeg')
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        return

def run():
    print('starting server...')

    # Server settings
    # Choose port 8080, for port 80, which is normally used for a http server, you need root access
    server_address = ('192.168.2.245', 8081)
    httpd = HTTPServer(server_address, MyHandler)
    print('running server...')
    httpd.serve_forever()


def processData(data):
    XMLlist = []
    data = data.split(":")
    field = data[0].split(">")
    print(data,field,data[2])
    try:
        exists = field[2]
    except:
        exists = False
    if data[0] == "XMLlist":
        path = os.path.realpath(__file__)
        path = os.path.dirname(path)
        path = path+"/"+data[2]
        for filename in os.listdir(path):
            if filename.endswith('.xml'):
                XMLlist.append(filename[:-3])
        return 1,XMLlist
    elif exists != False:
        file = open(data[2]+data[3], 'r')
        tree = minidom.parse(file)
        camera = tree.getElementsByTagName(field[0])
        for element in camera:
            if element.getAttribute('id') == str(field[1]):
                print(data[1], field[0], field[1], field[2])
                element.getElementsByTagName(field[2])[0].childNodes[0].replaceWholeText(data[1])
        file = open(data[2]+data[3], 'w')
        tree.writexml(file)
        file.close()
        return 0, 0
    else:
        print(data)
        file = open(data[2]+data[3], 'r')
        tree = minidom.parse(file)
        tree.getElementsByTagName(data[0])[0].childNodes[0].replaceWholeText(data[1])
        file = open(data[2]+data[3], 'w')
        tree.writexml(file)
        file.close()
        return 0, 1
run()

谢谢你的回答,对不起我的英语不好!

【问题讨论】:

标签: python xml httpserver


【解决方案1】:

Access-Control-Allow-Origin 响应头表示是否 响应可以与具有给定来源的资源共享。

您需要将此标头添加到您的响应中:

Access-Control-Allow-Origin: *

不幸的是,SimpleHTTPServer 真的那么简单,它不允许任何自定义,尤其是它发送的标头。但是,您可以使用大部分 SimpleHTTPServerRequestHandler 自己创建一个简单的 HTTP 服务器,然后添加所需的标头。或子类 SimpleHTTPServer.SimpleHTTPRequestHandler 并改变 end_headers() 的行为

import SimpleHTTPServer

class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_my_headers()

        SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)

    def send_my_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")

if __name__ == '__main__':
    SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)

感谢answer 提供代码,这家伙 answer 拥有您理解 cros 所需的一切

【讨论】:

  • 非常感谢。我会尽量按照答案!我会让你知道...
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2018-12-30
相关资源
最近更新 更多