假设我有一个包含以下内容的字节流:
POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
有没有办法从中产生WSGI风格的"环境"字典?
希望,我忽略了一个简单的答案,并且它与相反的操作一样容易实现.考虑:
>>> import json
>>> from webob import Request
>>> r = Request.blank('/mum/ble?q=huh')
>>> r.method = 'POST'
>>> r.content_type = 'application/json'
>>> r.charset = 'utf-8'
>>> r.body = json.dumps(['do', 're', 'mi'])
>>> print str(r) # Request's __str__ method gives raw HTTP bytes back!
Run Code Online (Sandbox Code Playgroud)
POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
为此目的重用Python的标准库代码有点棘手(它不是设计为以这种方式重用! - ),但应该是可行的,例如:
import cStringIO
from wsgiref import simple_server, util
input_string = """POST /mum/ble?q=huh HTTP/1.0
Content-Length: 18
Content-Type: application/json; charset="utf-8"
Host: localhost:80
["do", "re", "mi"]
"""
class FakeHandler(simple_server.WSGIRequestHandler):
def __init__(self, rfile):
self.rfile = rfile
self.wfile = cStringIO.StringIO() # for error msgs
self.server = self
self.base_environ = {}
self.client_address = ['?', 80]
self.raw_requestline = self.rfile.readline()
self.parse_request()
def getenv(self):
env = self.get_environ()
util.setup_testing_defaults(env)
env['wsgi.input'] = self.rfile
return env
handler = FakeHandler(rfile=cStringIO.StringIO(input_string))
wsgi_env = handler.getenv()
print wsgi_env
Run Code Online (Sandbox Code Playgroud)
基本上,我们需要对请求处理程序进行子类化,以伪造通常由服务器为其执行的构造过程(rfile并wfile从套接字构建到客户端,依此类推).我认为这不完全,但应该很接近,我希望它证明是有帮助的!
请注意,我还修复了您的示例HTTP请求:HTTP/1.0在原始请求行的末尾没有或1.1,a POST被认为是格式错误并导致异常并产生错误消息handler.wfile.