LC_ALL für MOD_WSGI Applikation definieren

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Hallo Zusammen

Ich habe folgendes Problem, meine Anwendung liest die Ordnerstruktur vom Filesystem aus und zeigt diese schlussendlich als Seite an (ähnlich wie ListDirectory von Apache).
Der apache User hat das normale ANSI_X3.4-1968 encoding, die meisten Dateien auf der Harddisk sind jedoch im UTF-8 Format gespeichert. Wenn ich nun os.listdir() mit einem unicode-String aufrufe, versucht die Methode die Dateinamen in Unicode umzuwandeln und verwendet hierfür das Encoding das sys.getfilesystemencoding() liefert. Dies ist natürlich ANSI_X3.4-1968 und kann nicht alle UTF-8 Zeichen repräsentieren. Dies führt dann unweigerlich zu einem UnicodeDecodeError.

Gibt es eine Möglichkeit mod_wsgi beizubringen welches Encoding die Applikation nutzen soll? Oder gehe ich das Problem falsch an?

Gruess + Dank
Dm
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Setzt doch einfach die LANG Umgebungsvariable entsprechend.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Das war auch mein erster Gedanken, okey evtl. tue ich es am falschen Ort.

In meinem WSGI Script habe ich folgendes hinzugefügt, leider ohne Wirkung.

Code: Alles auswählen

process = subprocess.Popen("export LC_ALL=de_DE@UTF-8", shell=True, stdout=out)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DatenMetzgerX hat geschrieben:In meinem WSGI Script habe ich folgendes hinzugefügt, leider ohne Wirkung.

Code: Alles auswählen

process = subprocess.Popen("export LC_ALL=de_DE@UTF-8", shell=True, stdout=out)
Natürlich ist völlig effektfrei, da es eine Shell startet, in dieser ``LC_ALL`` definiert und die Shell wieder beendet, womit auch die Definition von ``LC_ALL`` verschwindet. Übrigens kann man, wenn man ``Popen`` verwendet, Umgebungsvariablen mittels des ``env``-Parameters übergeben; es ist also unnötig ``export`` zu nutzen, das sowieso nur in Unix-Shells funktioniert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Das Ausführen von subprocess.Popen ohne shell ergibt bei mir einen

Code: Alles auswählen

 OSError: [Errno 13] Permission denied
Fehler?

Die Variante mit SetEnv würde mir persönlich ja gefallen, jedoch scheint sie keinen Einfluss auf die Anwendung zu haben, oder jedenfalls nicht was LC_ALL betrifft.

Code: Alles auswählen

<VirtualHost *:80>
        ServerName server.ch
        ServerAlias server.ch
        SetEnv  LC_ALL  de_DE@UTF-8

        ErrorLog        /var/log/httpd/error_fileshare.log
        CustomLog	/var/log/httpd/access_fileshare.log common

        DocumentRoot /usr/local/www/documents

        <Directory /usr/local/www/documents>
                Order allow,deny
                Allow from all
        </Directory>

        WSGIScriptAlias /	/usr/local/www/wsgi/server.wsgi

        <Directory /usr/local/www/wsgi>
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DatenMetzgerX hat geschrieben:Das Ausführen von subprocess.Popen ohne shell ergibt bei mir einen

Code: Alles auswählen

 OSError: [Errno 13] Permission denied
Fehler?
``subprocess.Popen`` macht ja generell keinen Sinn, da Umgebungsvariablen der Elternprozesse an Kindprozesse weitergegeben werden, nicht andersrum. Wenn du eine Umgebungsvariable in einem Kindprozesse (der Shell) änderst, dann ist diese nur in der Shell gesetzt. Da die Shell danach sich sofort beendet, verschwindet auch die Variable.

Hast du nachgeschaut, was für Umgebungsvariablen in deiner WSGI-Applikation gesetzt sind?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Die $LANG Variabel hat den wert 'C'?! Wenn ich die Werte mit os.environ["LANG"] = 'de_CH.UTF-8' überschreibe steht dann zwar das richtige drin, hat jedoch keinen Einfluss auf sys.getfilesystemencoding().

Mein nächster Versuch war die locale des Systems in /etc/environment einzutragen. Diese greifen für das ganze System, nur nicht für meinen WSGI Prozess.

Daraufhin habe ich noch die Variabeln LC_ALL, LANG, LANGUAGE zu PassEnv hinzugefügt in der Apache konfiguraiton. LC_ALL & LANGUAGE scheinen zu greifen, LANG behält jedoch den Wert 'C'.

Langsam sehe ich echt nicht mehr durch...
Das mit dem Encoding des Filesystems und Python habe ich übrigens von hier

Dankschön DM
Antworten