unicode_literals を有効にしてヘッダーを追加すると、Nginx、uWSGI、およびシンプルな Flask アプリで失敗するようです:
# -*- 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 インタープリターのbytestring ( 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 )から発生しているようです。私はこのコードを正しく理解しています。
編集: Armin Ronacher は 5 か月前に同様のバグ ( https://github.com/mitsuhiko/flask/issues/758 ) を修正しましたが、まだ werkzeug git ログでコミットを見つけられませんでした。redirect()
修正の範囲が関数に限定されているのか、それともヘッダー処理に広く適用されているのかはわかりません。Werkzeug 0.9.4 と Flask 0.10.1 を使用しています。