我可以使用python的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)

我想说没有简单的方法可以做到这一点,其中简单意味着"只需添加 1-2 行即可写入额外的标头并保留现有功能"。因此,最好的解决方案是子类化SimpleHTTPRequestHandler类并重新实现该功能,并添加新的标头。

为什么没有简单的方法背后的问题可以通过查看 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

因此,不可能对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
...
# 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))

通过这样做,流程感觉正确。

1:您收到请求

2:应用所需的标头和响应类型

3:你发回你想要的数据,这是你想要的或如何。

上面的例子对我来说工作正常,可以进一步扩展,它只是一个裸露的 JSON 发布服务器。所以我会把它留在 SOF 上,以防有人需要它,或者我自己几个月后回来。

这确实会生成一个有效的 JSON文件,其中只有 sTest 对象,与 PHP 生成的页面/文件相同。

相关内容

  • 没有找到相关文章

最新更新