gpt4 book ai didi

python - 使用 unicode_literals 在 Flask 应用程序中添加 header

转载 作者:行者123 更新时间:2023-12-01 16:35:59 25 4
gpt4 key购买 nike

使用 Nginx、uWSGI 和简单的 Flask 应用程序添加启用 unicode_literals 的 header 似乎会失败:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from flask import Flask, make_response

app = Flask('test')

@app.route('/')
def index():
response = make_response()
response.status_code = 401
response.headers = {'WWW-Authenticate': 'Basic realm="test"'} # Fail
# response.headers = {b'WWW-Authenticate': b'Basic realm="test"'} # Succeed
return response

if __name__ == '__main__':
app.run(debug=True)

该应用程序可直接用于调试目的或通过 Nginx -> uWSGI -> Flask 并且运行良好。

  • 当我使用浏览器直接连接到应用程序时,我会看到一个登录对话框和WWW-Authenticate header 正确。
  • 通过 Nginx 的相同请求返回 header Transfer-Encoding: chunked 和丢弃 WWW-Authenticate header 。

强制字节字符串 (b'...') 格式添加 header 使应用程序在两种情况下都能按预期工作。
该文件以 UTF-8 编码,并且有一个 Python 解释器的
coding` 声明。我们使用 Python 2.7.3、Nginx 1.4.2 和 uWSGI 1.3。

Nginx 或 uWSGI、Flask 和 unicode_literals 之间是否存在任何已知的不兼容性?谢谢!

编辑:问题似乎来自uWSGI( https://github.com/unbit/uwsgi/blob/master/plugins/python/wsgi_headers.c#L116 ),因为它只检查 PyString 而不是 Python2 的 PyUnicode(如果我正确理解这段代码的话)。

编辑:Armin Ronacher 5 个月前修复了一个类似的 bug ( https://github.com/mitsuhiko/flask/issues/758 ),但我在 werkzeug git log 中还没有找到该提交。我不知道修复的范围是否仅限于 redirect() 函数或更广泛的 header 处理。我正在使用 Werkzeug 0.9.4 和 Flask 0.10.1。

最佳答案

这个问题确实是由于 Werkzeug 中的错误造成的。正如您所注意到的,自 2013 年 6 月 4 日起,此问题已得到更正(参见 Github 上的 related commit)。您可以使用 0.9.5 版本而不是 0.9.4 来获得 Werkzeug 的无错误版本。

此外,为了解决您的问题,我在 Flask 应用程序初始化后添加了 app.debug = True 。这让我在 uWSGI 日志中收到以下错误:

Traceback (most recent call last):
File "/home/afigura/.virtualenvs/stack-python2/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/home/afigura/.virtualenvs/stack-python2/lib/python2.7/site-packages/flask/app.py", line 1821, in wsgi_app
return response(environ, start_response)
File "/home/afigura/.virtualenvs/stack-python2/lib/python2.7/site-packages/werkzeug/wrappers.py", line 1201, in __call__
start_response(status, headers)
TypeError: http header key must be a string

这对应于 the bug you found 中提到的错误在 Github 上。

因此,您可以使用以下解决方法让 Flask/Werkzeugunicode_literals 配合使用:

response.headers = {b'WWW-Authenticate': 'Basic realm="test"'}

或者:

response.headers = {str('WWW-Authenticate'): 'Basic realm="test"'}

但如果可以的话,我建议您将 Werkzeug 版本更新为 >=0.9.5。

另外,请注意,虽然 Flask/Werkzeug 响应的 headers 属性的行为类似于字典,但它实际上是一个 Headers 对象(请参阅 Werkzeug source code ) 。因此,我建议您按如下方式使用它:

response.headers['WWW-Authenticate'] = 'Basic realm="test"'

您可以在Flask documentation上看到一些关于此的示例。函数make_response

关于python - 使用 unicode_literals 在 Flask 应用程序中添加 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410585/

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