Skip to main content
 首页 » 编程设计

python之如何在 Flask 中获取裸 wsgi 流

2025年05月04日16webabcd

使用 Flask,我想获得裸露的 wsgi.input 引用。查看代码,似乎有不止一种方法可以做到这一点,这两种方法都出现在:

werkzeug.wsgi.get_input_stream(environ, safe_fallback=True): 
    ... 
    if environ.get('wsgi.input_terminated'): 
        return stream 
    ... 
    if content_length is None: 
        return safe_fallback and _empty_stream or stream 
    ... 

令人恼火的是,我无法弄清楚如何让这两种情况中的任何一种发生(文档中几乎没有提到它们)。

wsgi.input_terminated:我知道如果我使用像 Apache 这样的合适的服务器我可以设置 wsgi 环境,但是我如何在 Flask 开发服务器下设置它,因为 Werkzeug 在 werkzeug.serving 中硬编码了它的 wsgi 环境。 make_environ()?

safe_fallback:完全搞不懂……如果它只是自己调用而从未传递,这个参数在这里做什么?我该如何激活它?

这里很可能遗漏了一些简单的东西......

请您参考如下方法:

这是@javabrett 在他对@ddzialek 的回答的评论中建议的函数的更详细版本。这在设置标志之前检查分块输入(我不认为这是必要的,但设置一个你可能不需要的标志似乎不是一个好主意)。

@app.before_request 
def handle_chunking(): 
    """ 
    Sets the "wsgi.input_terminated" environment flag, thus enabling 
    Werkzeug to pass chunked requests as streams; this makes the API 
    compliant with the HTTP/1.1 standard.  The gunicorn server should set 
    the flag, but this feature has not been implemented. 
    """ 
 
    transfer_encoding = request.headers.get("Transfer-Encoding", None) 
    if transfer_encoding == "chunked": 
        request.environ["wsgi.input_terminated"] = True 

实际通过的“传输编码”的值可能是 Unicode 而不是 ASCII,因此“u'chunked'”会更准确——但对于 ASCII 范围内的字符,差异是无关紧要的( Python 将以任何一种方式匹配字符串),并且 Python 3 不需要“u”。

编辑:重要的是要注意一些 WSGI 服务器不再需要此修复。具体来说,gunicorn 从 20.0 版开始就尊重 wsgi.input_terminated 标志,但应该注意的是 20.0 是第一个不支持 Python 2.x 的版本——因此,如果您无法使用 Python 2.x,您仍然需要此修复程序。