我有一个非常简单的 HTTP 服务器的以下 shell 脚本:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
我想知道如何为该服务器启用或添加CORS 标头?Access-Control-Allow-Origin: *
我有一个非常简单的 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 标头。
使用顶部的shebangsimple-cors-http-server.py
,使文件可执行并将其放入您的PATH,您也可以使用它来运行它。
Python 3 使用SimpleHTTPRequestHandler
and HTTPServer
fromhttp.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 使用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 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)
尝试像 http-server 这样的替代方案
由于 SimpleHTTPServer 并不是您真正部署到生产环境中的那种服务器,我在这里假设您并不关心您使用哪种工具,只要它能够http://localhost:3000
以简单的方式使用 CORS 标头公开您的文件命令行
# install (it requires nodejs/npm)
npm install http-server -g
#run
http-server -p 3000 --cors
需要 HTTPS?
如果您在本地需要 https,您也可以尝试caddy或certbot
一些您可能会觉得有用的相关工具
ngrok:运行时,它会创建一个允许任何人访问您的服务器ngrok http 3000
的 url 。它可以向世界公开在您的计算机上本地运行的内容(包括本地后端/api)https://$random.ngrok.com
http://localhost:3000
localtunnel:与 ngrok 几乎相同
现在:运行时now
,它会在线上传您的静态资产并将其部署到https://$random.now.sh
. 除非您另有决定,否则它们将永远在线。由于差异,部署速度很快(第一个除外)。现在适用于生产前端/SPA 代码部署它也可以部署 Docker 和 NodeJS 应用程序。它不是真正免费的,但他们有一个免费计划。
try this: https://github.com/zk4/livehttp. support CORS.
python3 -m pip install livehttp
goto your folder, and run livehttp
. that`s all.
http://localhost:5000
I had the same problem and came to this solution:
class Handler(SimpleHTTPRequestHandler):
def send_response(self, *args, **kwargs):
SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
self.send_header('Access-Control-Allow-Origin', '*')
I simply created a new class inheriting from SimpleHTTPRequestHandler that only changes the send_response
method.
您需要提供自己的 do_GET() 实例(如果选择支持 HEAD 操作,则需要提供 do_HEAD())。像这样的东西:
class MyHTTPServer(SimpleHTTPServer):
allowed_hosts = (('127.0.0.1', 80),)
def do_GET(self):
if self.client_address not in allowed_hosts:
self.send_response(401, 'request not allowed')
else:
super(MyHTTPServer, self).do_Get()