Fügen Sie Header in einer Flask App mit unicode_literals hinzu

Hinzufügen von Headern mit unicode_literals aktiviert scheint mit Nginx, uWSGI und einer einfachen Flask App zu scheitern:

# -*- 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) 

Die App ist direkt für Debug-Zweck oder über Nginx -> uWSGI -> Flasche und funktioniert gut.

  • Wenn ich einen Browser benutze, um mich direkt mit der App zu verbinden, habe ich einen Login-Dialog und der WWW-Authenticate Header ist richtig.
  • Die gleiche Anforderung, die durch Nginx geht, gibt einen Header zurück Transfert-Encoding: chunked und verwerfe den WWW-Authenticate Header.

Fortsetzen von thetestring ( 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 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 Codierung `Deklaration für den Python-Interpreter. Wir verwenden Python 2.7.3, Nginx 1.4.2 und uWSGI 1.3.

Gibt es irgendeine bekannte Inkompatibilität zwischen Nginx oder uWSGI, Flask und unicode_literals? Vielen Dank!

Bearbeiten: Das Problem scheint von uWSGI zu kommen ( https://github.com/unbit/uwsgi/blob/master/plugins/python/wsgi_headers.c#L116 ), da es nur für PyString und nicht PyUnicode für Python2 prüft, wenn Ich verstehe diesen Code richtig.

Bearbeiten: Armin Ronacher hat einen ähnlichen Fehler behoben ( https://github.com/mitsuhiko/flask/issues/758 ) vor 5 Monaten, aber ich habe das Commit noch nicht in werkzeug git log gefunden. Ich weiß nicht, ob das Update auf die redirect() -Funktion oder breiter auf Header-Handling skoped ist. Ich benutze Werkzeug 0.9.4 und Flasche 0.10.1.

One Solution collect form web for “Fügen Sie Header in einer Flask App mit unicode_literals hinzu”

Dieses Problem ist in der Tat auf einen Fehler in Werkzeug . Wie Sie bemerkt haben, wird dies nun seit dem 4. Juni 2013 korrigiert (vgl. Das dazugehörige Commit auf Github). Sie können eine Bug-freie Version von Werkzeug haben, indem Sie die Version 0.9.5 anstelle der 0.9.4 verwenden .

app.debug = True Ihr Problem zu beheben, habe ich erst nach der Initialisierung Ihrer Flask-Anwendung app.debug = True hinzugefügt. Dies erlaubt mir, den folgenden Fehler in uWSGI-Protokolle zu erhalten:

 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 

Dies entspricht dem Fehler, der in dem Bug erwähnt wurde, den du auf Github gefunden hast .

So können Sie die folgende Workaround verwenden, um Flask / Werkzeug mit unicode_literals :

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

Oder:

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

Aber ich empfehle, einfach deine Werkzeugversion auf> = 0.9.5 zu aktualisieren, wenn du kannst.

Bitte beachten Sie auch, dass, obwohl die headers Attribute einer Flask / Werkzeug-Antwort verhält sich wie ein Wörterbuch, ist es in der Tat ein Headers Objekt (siehe Werkzeug Quellcode ). Daher rate ich Ihnen, es wie folgt zu benutzen:

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

Hier sehen Sie einige Beispiele dazu auf der make_response der Funktion make_response .

  • UnicodeDecodeError: ungültiges Startbyte
  • Kodierung in Python 2.7
  • Entfernen Sie Akzentzeichen Zeichenfolge - Python
  • Python 3 UnicodeDecodeError: 'charmap' Codec kann das Byte 0x9d nicht decodieren
  • Stdout-Kodierung in Python
  • Alle Unicode-Codes zwischen U + E000-U + F8FF mit Python auflisten
  • Decodierung Unicode in Python
  • Python ascii utf Unicode
  • Python: Konvertieren Sie Unicode-Hex-String in Unicode
  • Reguläre Ausdrücke und Zeichencodes in Scrapy-Exportdaten
  • Python, um in UTF8 auf Windows XP mit der Konsole zu drucken
  • Python ist die beste Programmiersprache der Welt.