python – 在简单的HTTP服务器上启用访问控制

我有一个非常简单的HTTP服务器的以下shell脚本:

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

我想知道如何启用或添加a CORS header像Access-Control-Allow-Origin:*到这个服务器?

解决方法:

不幸的是,简单的HTTP服务器非常简单,它不允许任何自定义,特别是它不发送的头.但是,您可以使用大多数SimpleHTTPRequestHandler自己创建一个简单的HTTP服务器,并添加所需的标头.

为此,只需创建一个文件simple-cors-http-server.py(或其他),并根据您使用的Python版本,将以下代码之一放入其中.

然后你可以做python simple-cors-http-server.py它会启动你修改过的服务器,它会为每个响应设置CORS头.

shebang放在顶部,使文件可执行并将其放入PATH,您也可以使用simple-cors-http-server.py运行它.

Python 3解决方案

Python 3使用http.server module中的SimpleHTTPRequestHandlerHTTPServer来运行服务器:

#!/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.SimpleHTTPRequestHandlerBaseHTTPServer module来运行服务器.

#!/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)
上一篇:如何从python http Web服务器发送html字符串?


下一篇:使用python2与python3创建一个简单的http服务(基于SimpleHTTPServer)