Python 如何构造webob.Request或WSGI';环境';来自原始HTTP请求字节流的dict?

Python 如何构造webob.Request或WSGI';环境';来自原始HTTP请求字节流的dict?,python,wsgi,webob,Python,Wsgi,Webob,假设我有一个字节流,其中包含以下内容: POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"] POST/mum/ble?q=huh 内容长度:18 内容类型:application/json;charset=“utf-8” 主机:本地主机:80 [“do”、“re”、“mi”] 为此目的重用Pytho

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

POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"] POST/mum/ble?q=huh 内容长度:18 内容类型:application/json;charset=“utf-8” 主机:本地主机: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
基本上,我们需要对请求处理程序进行子类化,以伪造通常由服务器为其执行的构造过程(
rfile
wfile
从套接字构建到客户端,等等)。我认为这还不太完整,但应该很接近,我希望它能有所帮助


请注意,我还修复了您的示例HTTP请求:如果原始请求行末尾没有
HTTP/1.0
或1.1,则
POST
被视为格式不正确,并在
handler.wfile
上导致异常和错误消息,谢谢,Alex,它的工作方式与宣传的一样。我还通过webob.Request.str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,在执行“handler=FakeHandler(…)”之后,最好执行“del handler.server”。@offby1,一个引用循环(由
self.server=self
创建)不是内存泄漏,因为Python确实对引用循环进行了垃圾收集;如果你能明智地打破循环,那将通过避免
gc
pass来加快速度。 POST /mum/ble?q=huh Content-Length: 18 Content-Type: application/json; charset="utf-8" Host: localhost:80 ["do", "re", "mi"]
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