nyn*_*464 48 python cross-domain simplehttpserver
我正在SimpleHTTPServer测试一些我正在研究的网页.它工作得很好,但我需要做一些跨域请求.这需要设置Access-Control-Allow-Origin允许页面访问的域的标头.
有一种简单的方法可以使用SimpleHTTPServer设置标头并提供原始内容吗?每个请求的标头都是相同的.
ber*_*rto 49
这有点像黑客,因为它改变了end_headers()行为,但我认为它比复制和粘贴整个SimpleHTTPServer.py文件要好一些.
我的方法覆盖end_headers()了一个子类,并在其中调用send_my_headers()后调用超类end_headers().
它不是1-2线,但不到20线; 主要是样板.
#!/usr/bin/env python
import SimpleHTTPServer
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_my_headers()
SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Access-Control-Allow-Origin", "*")
if __name__ == '__main__':
SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)
Run Code Online (Sandbox Code Playgroud)
我说没有简单的方法可以做到这一点,简单的意思是"只需添加1-2行就可以编写额外的标题并保留现有的功能".因此,最好的解决方案是通过SimpleHTTPRequestHandler添加新标头来继承类并重新实现功能.
通过查看SimpleHTTPRequestHandlerPython库中类的实现,可以观察到为什么没有简单的方法可以解决这个问题: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类进行子类化,完全按照库中的代码实现它(只需复制粘贴它?),并在调用end_headers()方法之前添加另一个标头send_head():
...
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
...
Run Code Online (Sandbox Code Playgroud)
# 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()
Run Code Online (Sandbox Code Playgroud)