2014-12-11 5 views
5

Ich baue eine kleine RESTful API mit Flasche in Python und derzeit ein Problem mit Zeichenkodierungen bei der Arbeit mit dem Anfrageobjekt.Python Flasche Anfragen und Unicode

Trifft http://server.com/api?q=äöü und schaut auf request.query['q'] auf dem Server bekommt mich "¤ö", was offensichtlich nicht das ist, wonach ich suche.

Gleiches gilt für eine POST-Anfrage, die den form-urlencodierten Schlüssel q mit dem Wert äöü enthält. request.forms.get('q') enthält "Häschen".

Was geht hier vor? Ich habe nicht wirklich die Möglichkeit, diese Elemente mit einer anderen Kodierung zu dekodieren, oder? Gibt es eine allgemeine Option für eine Flasche, um diese in Unicode zu speichern?

Danke.

Antwort

7

request.query['q'] und forms.get('q') geben den Byte-Rohwert zurück, der vom Webbrowser gesendet wurde. Der Wert äöü, der von einem Browser als UTF-8-codierte Bytes übermittelt wird, lautet '\xc3\xa4\xc3\xb6\xc3\xbc'.

Wenn Sie diese Byte-Zeichenfolge und die Stelle, an der Sie sie drucken, als ISO-8859-1 oder die ähnliche Windows-Codepage 1252 interpretieren, erhalten Sie äöü. Wenn Sie debuggen, indem Sie an einer Windows-Eingabeaufforderung oder einer Datei drucken, die von Editor angezeigt wird, warum.

Wenn Sie die alternative direct property accessrequest.query.q oder forms.q Bottle verwenden, erhalten Sie stattdessen Unicode-Zeichenfolgen, die mit UTF-8 aus der Byte-Version decodiert werden. Normalerweise ist es am besten, mit diesen Unicode-Zeichenfolgen zu arbeiten, wo immer Sie können. (Trotzdem können Sie Probleme haben, sie an die Konsole zu drucken. Die Windows-Eingabeaufforderung ist notorisch schrecklich im Umgang mit Nicht-ASCII-Zeichen, und daher ist es ein schlechter Ort, Unicode-Probleme zu debuggen.)

+0

Ich hatte keine direkte Idee Zugang wie das war möglich. Vielen Dank! –

+0

Muss in Form eines Wörterbuchs verwendet werden, um die Eigenschaften nach Nicht-Standard zu durchsuchen, indem der POST gesendet wird. Es gibt eine andere Alternative. Anders diese 'request.POST.question_10' als solche' request.POST ["question_10"] '? – Jones

+1

Wenn Sie eine Eigenschaft mit einem nicht-identischen oder dynamischen Namen lesen müssen, können Sie 'getattr' immer wie jedes andere Objekt verwenden. zB 'getattr (Formen, 'q')' – bobince