代码之家  ›  专栏  ›  技术社区  ›  Pavel Repin

如何从原始HTTP请求字节流构造webob.Request或WSGI“environ”dict?

  •  3
  • Pavel Repin  · 技术社区  · 15 年前

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

    POST /mum/ble?q=huh
    Content-Length: 18
    Content-Type: application/json; charset="utf-8"
    Host: localhost:80
    
    ["do", "re", "mi"]
    

    有没有办法从中生成WSGI风格的“环境”dict?

    希望我忽略了一个简单的答案,它和相反的操作一样容易实现。 考虑:

    >>> 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
    Content-Length: 18
    Content-Type: application/json; charset="utf-8"
    Host: localhost:80
    
    ["do", "re", "mi"]
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Alex Martelli    15 年前

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

    基本上,我们需要对请求处理程序进行子类化,以伪造通常由服务器为其执行的构造过程( rfile wfile

    注意,我还修复了您的示例HTTP请求:没有 HTTP/1.0 或1.1在原始请求行的末尾 POST 被视为格式错误,并在上引发异常和由此产生的错误消息 handler.wfile .