在 Nginx、uWSGI 和一个简单的 Flask 应用程序中添加启用 unicode_literals 的标头似乎会失败:
# -*- 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
标题是正确的。 - 通过 Nginx 的相同请求返回一个标头
Transfert-Encoding: chunked
并丢弃该WWW-Authenticate
标头。
强制字节串(b'...') format to add the header make the app works as expected in both cases.
The file is encoded in UTF-8 and there's a
Python 解释器的编码声明。我们使用 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 个月前修复了一个类似的错误(https://github.com/mitsuhiko/flask/issues/758),但我还没有在 werkzeug git log 中找到提交。我不知道修复的范围是redirect()
函数还是更广泛的标头处理。我正在使用 Werkzeug 0.9.4 和 Flask 0.10.1。