在简单的HTTP服务器上启用访问控制
对于非常简单的HTTP服务器,我具有以下shell脚本:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
我想知道我怎么可以启用或添加CORS标题喜欢Access-Control-Allow-Origin: *
到这台服务器?
-
不幸的是,简单的HTTP服务器是如此简单,以至于它不允许任何自定义,尤其是不允许其发送的标头。但是,您可以使用的大部分内容自己创建一个简单的HTTP服务器
SimpleHTTPRequestHandler
,而只需添加所需的标头即可。为此,只需创建一个文件
simple-cors-http-server.py
(或其他文件),然后根据所使用的Python版本,将以下代码之一放入其中。然后您可以做
python simple-cors-http-server.py
,它将启动您的修改后的服务器,该服务器将为每个响应设置CORS标头。将shebang放在顶部,将文件设为可执行文件并将其放入PATH,您也可以使用它来运行它
simple- cors-http-server.py
。Python 3解决方案
Python
3使用SimpleHTTPRequestHandler
和HTTPServer
从http.server
模块运行服务器:#!/usr/bin/env python3 from http.server import HTTPServer, SimpleHTTPRequestHandler, test import sys class CORSRequestHandler (SimpleHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') SimpleHTTPRequestHandler.end_headers(self) if __name__ == '__main__': test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
Python 2解决方案
Python
2使用SimpleHTTPServer.SimpleHTTPRequestHandler
和BaseHTTPServer
模块来运行服务器。#!/usr/bin/env python2 from SimpleHTTPServer import SimpleHTTPRequestHandler import BaseHTTPServer class CORSRequestHandler (SimpleHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') SimpleHTTPRequestHandler.end_headers(self) if __name__ == '__main__': BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)
Python 2和3解决方案
如果您需要同时兼容Python 3和Python 2,则可以使用在两个版本中都可以使用的多语言脚本。它首先尝试从Python
3位置导入,否则回落到Python 2:#!/usr/bin/env python try: # Python 3 from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig import sys def test (*args): test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000) except ImportError: # Python 2 from BaseHTTPServer import HTTPServer, test from SimpleHTTPServer import SimpleHTTPRequestHandler class CORSRequestHandler (SimpleHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') SimpleHTTPRequestHandler.end_headers(self) if __name__ == '__main__': test(CORSRequestHandler, HTTPServer)