2017-04-10 45 views
0

我有一个问题,基于HttpServer的一个Python的Web服务器:错误:没有“访问控制允许来源”标头在Python Web服务器

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

问题: 我做了一个接口在html/jquery中发送请求到服务器。 问题是,当我向位于“cameras computer”中的服务器发送一个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() 

谢谢你的答案和我的英语不好对不起!

回答

0

The Access-Control-Allow-Origin response header indicates whether the response can be shared with resources with the given origin.

您需要将此头添加到您的回应:

Access-Control-Allow-Origin: * 

不幸的是,SimpleHTTPServer是真的那么简单,它不允许任何定制,特别是不发送的报头。但是,您可以自己创建一个简单的HTTP服务器,并使用大多数SimpleHTTPServerRequestHandler,只需添加所需的标头即可。或子类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拥有所有你需要了解的CRO

+0

非常感谢你的。我会尽量按照答案!我会告诉你... –

相关问题