我可以用python的SimpleHTTPServer设置一个头文件吗?
我正在使用SimpleHTTPServer
来testing我正在处理的一些网页。 它工作得很好,但是我需要做一些跨域请求。 这需要设置一个Access-Control-Allow-Origin
标头,允许页面被允许访问的域。
有没有简单的方法来设置一个标头与SimpleHTTPServer并提供原始内容? 标题在每个请求上都是一样的。
这是一个黑客,因为它改变了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)
我会说没有简单的方法来做到这一点,简单的意思是“只需添加1-2行,将写入额外的头,并保持现有的function” 。 所以,最好的解决scheme是对SimpleHTTPRequestHandler
类进行子类化,并重新实现function,并添加新的头文件。
通过查看Python库中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
因此,不可能do_GET()
SimpleHTTPRequestHandler
处理程序,调用超类do_GET()
方法,然后添加另一个头 – 因为在调用超类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 ...
# 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()
虽然这是一个较老的答案,其谷歌的第一个结果…
基本上@ iMon0build议什么..看来正确吗? 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))
通过这样做,stream量感觉正确..
1:你收到一个请求
2:你应用你想要的标题和响应types
3:你回发你想要的数据,不pipe你想要什么或想要什么。
上面的例子对我来说工作得很好,可以进一步扩展,它只是一个裸骨的JSON发布服务器。 所以我会把这个放在SOF上,以防有人需要它,或者我自己在几个月后回来。
这确实会产生一个只有sTest对象的有效JSON文件 ,与PHP生成的页面/文件相同。