我正在使用 SimpleHTTPServer
来测试一些我正在开发的网页。它非常好用,但是我需要进行一些跨域请求。这需要设置一个包含页面允许访问的域名的 Access-Control-Allow-Origin
头。
有没有一种简单的方法可以在 SimpleHTTPServer 中设置头并提供原始内容呢?每个请求的头都是相同的。
我正在使用 SimpleHTTPServer
来测试一些我正在开发的网页。它非常好用,但是我需要进行一些跨域请求。这需要设置一个包含页面允许访问的域名的 Access-Control-Allow-Origin
头。
有没有一种简单的方法可以在 SimpleHTTPServer 中设置头并提供原始内容呢?每个请求的头都是相同的。
这是一个小技巧,因为它改变了end_headers()
的行为,但我认为它比复制和粘贴整个SimpleHTTPServer.py
文件略好。
我的方法是在子类中覆盖end_headers()
,并在其中调用send_my_headers()
, 然后调用超类的end_headers()
。
它不是1-2行代码,但也不到20行; 主要是样板文件。
#!/usr/bin/env python
try:
from http import server # Python 3
except ImportError:
import SimpleHTTPServer as server # Python 2
class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_my_headers()
server.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Access-Control-Allow-Origin", "*")
if __name__ == '__main__':
server.test(HandlerClass=MyHTTPRequestHandler)
SimpleHTTPRequestHandler
类进行子类化,并重新实现功能,并添加新的标题。SimpleHTTPRequestHandler
类的实现:http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server.py#l654。请注意send_head()
方法,特别是该方法末尾的几行,这些行发送响应标头。请注意调用end_headers()
方法。此方法将标头与空行一起写入输出,该行表示所有标头的结束和响应正文的开始:http://docs.python.org/py3k/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers。SimpleHTTPRequestHandler
处理程序进行子类化,调用超类do_GET()
方法,然后只添加另一个标题——因为当调用超类do_GET()
方法返回时,标头的发送已经完成。必须像这样工作,因为do_GET()
方法必须发送正文(所请求的文件),并且要发送正文,它必须完成发送标头。SimpleHTTPRequestHandler
类,将其实现与库中的代码完全相同(只需复制粘贴即可?),并在send_head()
方法中的调用end_headers()
方法之前添加另一个标题。...
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
# this below is the new header
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
return f
...
# coding: utf-8
import SimpleHTTPServer
import SocketServer
PORT = 9999
def do_GET(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', 'http://example.com')
self.end_headers()
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
Handler.do_GET = do_GET
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
虽然这是一个较旧的答案,但它是谷歌搜索结果中的第一个...
基本上就是 @iMon0 建议的...看起来正确?.. doPOST
的示例
def do_POST(self):
self.send_response()
self.send_header('Content-type','application/json')
self.send_header('Access-Control-Allow-Origin','*')
self.end_headers()
sTest = {}
sTest['dummyitem'] = "Just an example of JSON"
self.wfile.write(json.dumps(sTest))
python -m SimpleHTTPServer --header=Access-Control-Allow-Origin
这样的东西。这是不可能的,所以你最终不得不实现一些代码来完成它。当然,你可以扩展 SimpleHTTPServer
来做很多其他的事情。 - nynexman4464self.send_response
会导致错误。1)它是一个函数,所以实际上应该是 self.send_response()
;2)该函数总是需要你传递一个 code
参数的值。 - rbaleksandarself.send_response
= 打字错误。 - Angry 84
def do_GET(self): self.send_head()
- user474708