我有一个非常简单的HTTP服务器的Shell脚本:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
我想知道如何在这个服务器上启用或添加类似于Access-Control-Allow-Origin: *
的CORS标头。我想知道如何在这个服务器上启用或添加类似于 Access-Control-Allow-Origin: * 的CORS标头。
我有一个非常简单的HTTP服务器的Shell脚本:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
我想知道如何在这个服务器上启用或添加类似于Access-Control-Allow-Origin: *
的CORS标头。不幸的是,简单的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使用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 使用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/1.0 501 Unsupported method ('OPTIONS') Server: SimpleHTTP/0.6 Python/2.7.6 Date: Wed, 21 Jan 2015 23:16:10 GMT Content-Type: text/html Connection: close Access-Control-Allow-Origin: *
- HairOfTheDogtest
(https://github.com/python/cpython/blob/v3.11.2/Lib/http/server.py#L1246)设置了实际的服务器和命令行处理。当您直接运行 http.server
模块时,它是默认的入口点。我在这里只是重用了这个确切的功能,以避免自己编写实现。 - poke尝试使用像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
编辑于2022年:我现在最喜欢的解决方案是serve,Next.js内部使用。
只需运行npx serve --cors
您可能会发现有用的一些相关工具
ngrok:运行ngrok http 3000
时,它会创建一个urlhttps://$random.ngrok.com
,允许任何人访问您的http://localhost:3000
服务器。它可以将本地计算机上运行的内容(包括本地后端/ API)公开到世界。
localtunnel:与ngrok几乎相同
now:运行now
时,它会在线上传您的静态资产并将其部署到https://$random.now.sh
。除非您决定否则,它们将永久在线。由于差异化,部署快速(除了第一个)。Now适用于生产前端/ SPA代码部署,也可以部署Docker和NodeJS应用程序。它不是真正免费的,但他们有一个免费计划。
npm
的解决方案,我会反对它。 - Parthian Shotnpm
,也不打算这样做。当我想要解决像HTTP服务器上的CORS标头这样的简单问题时,我特别不会每次都安装新的语言或包管理器。但无论如何... OP 熟悉 Python,并要求提供 Python 解决方案。因此,根据定义,“合适的工具”就是 Python。 - Parthian Shot我遇到了同样的问题,并找到了这个解决方案:
class Handler(SimpleHTTPRequestHandler):
def send_response(self, *args, **kwargs):
SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
self.send_header('Access-Control-Allow-Origin', '*')
我只是创建了一个继承自SimpleHTTPRequestHandler的新类,它只改变了send_response
方法。
python3 -m pip install livehttp
前往您的文件夹,然后运行livehttp
。就这么简单。
http://localhost:5000
您需要提供自己的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()
我的工作代码:
self.send_response(200)
self.send_header( "Access-Control-Allow-Origin", "*")
self.end_headers()
self.wfile.write( bytes(json.dumps( answ ), 'utf-8'))