2010-12-09 7 views
9

Ich versuche, eine Bilddatei in django Admin inlines und bekommen UnicodeEncodeError zu laden, wenn eine Datei mit einem Dateinamen mit nicht-ASCII-Zeichen zu laden versuchen:UnicodeEncodeError beim Speichern Imagefield Nicht-ASCII-Zeichen in Django Admin enthält

File "/usr/local/lib/python2.6/site-packages/django/db/models/fields/files.py", line 92, in save 
    self.name = self.storage.save(name, content) 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 47, in save 
    name = self.get_available_name(name) 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 73, in get_available_name 
    while self.exists(name): 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 196, in exists 
    return os.path.exists(self.path(name)) 

File "/usr/local/lib/python2.6/genericpath.py", line 18, in exists 
    st = os.stat(path) 

Es gibt einen Absatz über dieses Problem in Django Dokumente: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - sie sagen, ich muss definieren LANG und LC_ALL env-Variablen, plus ihre Definition mit os.env wird nicht funktionieren. Also habe ich sie in meinem .htaccess-Datei definiert und ich bin sicher, sie sind da:

META 
Variable Value 
CONTENT_LENGTH '27289' 
... 
LANG 'en_US.UTF-8' 
LC_ALL 'en_US.UTF-8' 
LC_LANG  'en_US.UTF-8' 

Das Problem weiterhin besteht. Django-Version ist 1.2.3 (neueste stabile), sys.getfilesystememoding() (die ich glaube, dass für das Problem relevant ist) gibt "ANSI_X3.4-1968" zurück.

Der Modell-/Admin-Code ist nichts Besonderes: ein ArticleImage-Modell mit ImageField und ArticleAdmin mit ArticleImage-Inlines.

UPDATE Ich konnte dieses Problem nicht beheben, daher habe ich die Apache-Installation aufgegeben und die Anwendung mit runfcgi + nginx gestartet. Uploads funktionieren jetzt gut, aber ich füge das nicht als Lösung hinzu, weil die Frage über Apache war.

Antwort

6

Sie sollten versuchen, LANG und LC_ALL für die gesamte Apache 2-Umgebung zu definieren.

Für meine Bereitstellungen stelle ich auch sicher, dass die Python-Standardsystemcodierung ebenfalls auf utf-8 gesetzt ist.

Für die Python Standard-Kodierung I/bearbeiten sitecustomize.py in der Regel erstellen, finden http://blog.ianbicking.org/illusive-setdefaultencoding.html

Wie für Apache - es gibt Zeile in Init-Skript /etc/init.d/apache2 (Ubuntu 8.04 LTS), der schafft das Umgebung. Ich habe dort die richtige LC_ALL, LANG hinzugefügt. Grundsätzlich sollte es in den Server-Init-Skripten irgendwo für alle Betriebssysteme sein.

export LANG='en_GB.UTF-8' 
export LC_ALL='en_GB.UTF-8' 

... das ist für UK Web-Server:

+0

Danke. Wie mache ich das richtig und stelle sicher, dass es funktioniert? Ich habe meine/usr/sbin/envvars bearbeitet, indem ich diese Variablen hinzugefügt habe und das Python-Skript hat # - * - coding: utf-8 - * - – Andrey

7

auf Debian (Lenny) Sie einfach die folgenden zwei Zeilen zu /etc/apache2/envvars hinzufügen. Für US:

export LANG='en_US.UTF-8' 
export LC_ALL='en_US.UTF-8' 

Und Apache neu starten.

+0

Ich musste den ganzen Rechner neu starten, bevor es funktionierte. –

+0

Die CentOS/Red Hat-Datei für Apache-Umgebungsvariablen ist '/ etc/sysconfig/httpd' –

0

können Sie dies tun.

in Linux:

echo $LANG i got zh_CN.UTF-8 

in apache2/envvars

export LANG='zh_CN.UTF-8' #keep this variable like echo $LANG. 
export LC_ALL='zh_CN.UTF-8' #the same. 

https://docs.djangoproject.com/en/1.4/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror diese doc ist mir zu helfen.

ich denke, es ist das os und apache problem!

+1

Bitte versuchen Sie es zu vermeiden, Kommentare (" das hat für mich gearbeitet! ") Oder Kontaktinformationen in den Beiträgen! –

Verwandte Themen