Django: UnicodeEncodeError mit WSGI und Apache

Nach dem Upload von Dateien, die Umlaute im Dateinamen enthalten, liefert Django folgenden Fehler:

[Sat Mar 26 22:18:53 2011] [error] [client x.x.x.x] UnicodeEncodeError: ‚ascii‘ codec can’t encode character u’\\xf6′ in position 17: ordinal not in range(128)

Ursache hierfür ist, dass der Dateiname Umlaute enthält, die mit UTF-8 encodiert sind – Python bzw. Django allerdings kein UTF-8 verarbeiten will.

Apache2 wird unter Debian standardmäßig mit „LANG=C“ gestartet – er berücksichtigt also keinerlei Locales.

Um UTF-8 auch im Dateisystem verarbeiten zu können (os.path() o.ä.), muss dem Apache die korrekte Locale mitgeteilt werden.

Falls noch nicht geschehen, muss das Paket „locales“ installiert werden:

aptitude install locales

Nun die nötige Änderung in der Datei /etc/apache2/envvars vornehmen:

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

(Entfernen des Kommentarzeichens in der letzten hier aufgeführten Zeile)

Die genannte Datei /etc/default/locale wird über folgenden Befehl konfiguriert:

dpkg-reconfigure locales

Hier muss darauf geachtet werden, dass Locales mit UTF-8 selektiert werden – und in der zweiten Auswahl eine entsprechende als Standard gesetzt wird. Zu empfehlen ist entweder en_US.UTF-8 oder de_DE.UTF-8.

Somit befindet sich in der Datei /etc/default/locale beispielsweise folgender Inhalt:

# File generated by update-locale
LANG=de_DE.UTF-8

Nach dem Neustart des Apache sollte Python respektive die Django-Anwendung nun auch Dateien mit UTF-8-Umlauten verarbeiten können.

Post navigation