3

假设我有一个字节流,其中包含以下内容:

POST /mum/ble?q=huh
内容长度:18
内容类型:应用程序/json;字符集="utf-8"
主机:本地主机:80

[“做”,“重新”,“我”]

有没有办法从中生成 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!
POST /mum/ble?q=huh
内容长度:18
内容类型:应用程序/json;字符集="utf-8"
主机:本地主机:80

[“做”,“重新”,“我”]
4

1 回答 1

5

为此目的重用 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

基本上,我们需要对请求处理程序进行子类化,以伪造通常由服务器为其执行的构造过程(rfilewfile从套接字构建到客户端,等等)。我认为这还不是很完整,但应该很接近,我希望它会有所帮助!

请注意,我还修复了您的示例 HTTP 请求:HTTP/1.0在原始请求行的末尾没有 or 1.1,aPOST被认为是格式错误的,并导致异常并在handler.wfile.

于 2009-06-18T03:27:59.043 回答