2017-12-16 16 views
0

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.

+2

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

+0

Ich werde versuchen, de/encoding von Hand. Apache und Nginx werden jedoch von www-data ausgeführt, die dieselben Gebietsschemas haben. – Bitbart

+0

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

Antwort

0

Die Lösung wurde in /etc/apache2/envvars versteckt:

## The locale used by some modules like mod_dav 
export LANG=C 
## Uncomment the following line to use the system default locale instead: 
. /etc/default/locale