WennDjango UnicodeDecodeError nur auf Apache/nginx
locale.getlocale()
locale.getdefaultlocale()
sys.getfilesystemencoding()
sys.getdefaultencoding()
durch manage.py shell
ausgeführt wird, erhalte ich
('en_US', 'UTF-8')
('en_US', 'UTF-8')
utf-8
utf-8
Welche meine Schauplätze passt:
LANG=en_US.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
Wenn jedoch die Anforderung behandelt von Apache/Nginx produziert es:
(None, None)
(None, None)
ascii
utf-8
Dies führt zu mehreren UnicodeDecodeErrors auf meiner Website, und ich konnte den Grund für die fehlende Übereinstimmung nicht finden. Keine Einstellung AddDefaultCharset utf-8
für Apache oder charset utf-8;
für Nginx löste das Problem.
Der Webserver wird als separater Benutzer ausgeführt. Sie haben das Gebietsschema dieses Benutzers festgelegt. Ein robusterer Ansatz wäre, sich nicht auf das Gebietsschema zu verlassen; Deklaration explizit deklarieren beim Öffnen von Dateien, De-/Encoding von Streams etc. In jedem Fall sollten Sie sich fragen, wer die Wahl der Encodierung steuern sollte: die Umgebung (möglicherweise verursacht Codierungsfehler zur Laufzeit, wenn die Wahl der Umgebung nicht stimmt) oder Ihre Schnittstelle? – lenz
Ich werde versuchen, de/encoding von Hand. Apache und Nginx werden jedoch von www-data ausgeführt, die dieselben Gebietsschemas haben. – Bitbart
klingt seltsam. Ich muss jedoch zugeben, dass ich nicht jedes Detail verstehe, wie Python zu seinen Standard-Kodierungen für I/O gelangt. Was für mich nur ein weiterer Grund war, sich nicht auf sie zu verlassen. – lenz