gpt4 book ai didi

python - 如何在 Flask 中获取裸 wsgi 流?

转载 作者:太空宇宙 更新时间:2023-11-04 08:06:06 24 4
gpt4 key购买 nike

使用 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,您仍然需要此修复程序。

关于python - 如何在 Flask 中获取裸 wsgi 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com