Seite 1 von 1
UnicodeDecodeError bei ImageFileField
Verfasst: Freitag 12. Juni 2009, 15:53
von ferix
Hallo zusammen,
ich hab da ein kleines Problem mit einem ImageFileField.
Ich sags gleich...in der Development-Version auf meiner
Entwicklermaschine funktioniert es, aber auf meinem Server
mit Django 1.0.2 dann nicht mehr.
Also folgendes:
Code: Alles auswählen
object_images = Image.objects.filter(...)
IS24Export.export(object_images)
Ich hole mir mit einem Filter bestimmte Objekte meiner Image-Klasse (Model), die auch ein ImageFile enthält, und übergebe den Rückgabewert bei dem Aufruf einer Funktion.
Code: Alles auswählen
class IS24Export(object):
@staticmethod
def export(object_images):
...
for entry in object_images:
z.write(entry.image.path, os.path.basename(entry.image.path))
z.close()
...
return 0
In der aufgerufenen Funktion möchte ich gerne die ImageFiles der übergegeben Objekte einer ZIP-File hinzufügen, was auch wie gesagt
beim entwickeln funktioniert und jetzt auf dem Server nicht mehr.
Bei der Zeile
Code: Alles auswählen
z.write(entry.image.path, os.path.basename(entry.image.path))
kommt eben folgender Fehler:
Exception Type: UnicodeDecodeError
Exception Value: 'ascii' codec can't decode byte 0x81 in position 11: ordinal not in range(128)
Das hängt ja wohl ziemlich sicher am entry.image.path!??!
Jemand eine Ahnung woran das hängen könnte?
Eigentlich sind alle Dateien auch als UTL-8 erstellt, weswegen es mich
wundert wo jetzt das ascii herkommt.
Danke für Anregungen.
Verfasst: Freitag 12. Juni 2009, 16:40
von ferix
Also ich habe jetzt definitv rausgefunden, dass es nicht an dem entry.image.path hängt. Das kann ganz normal ausgelesen werden.
Irgendwie muss der Fehler mit dem schreiben der ZIP-File zustande kommen!?
Könnte es sein, dass der Fehler bei Python Version 2.5 nicht mehr auftritt?
http://mail.python.org/pipermail/python ... 30896.html
Dieser Link scheint darauf hinzudeuten, dass es was mit Python 2.4 zu tun hat.
Verfasst: Freitag 12. Juni 2009, 17:10
von ferix
Da ich mir nun ziemlich sicher sein kann, dass der Fehler mit python2.5 behoben ist.
Wie installiere ich dieses am Besten auf ein Debian Etch System?
Ich hatte es eben ganz einfach mit "apt-get install python2.5" versucht und den python-Symlink darauf gesetzt.
Das Problem ist, dass Django weiterhon mit Python 2.4 arbeitet, da es in den Site-Packages von Python 2.4 installiert ist. Genau sieht es mit der Python IMage Library aus. Wie kann man das relativ "schmerzfrei" umdoktern!?
Verfasst: Freitag 12. Juni 2009, 18:40
von Leonidas
Na indem man PIL und Django für Python 2.5 installiert.
Ich habe mir selbst einen Backport für Python 2.6 gemacht, die restlichen Packages habe ich in /usr/local via easy_install nachinstalliert.
Verfasst: Freitag 12. Juni 2009, 18:50
von ferix
Ok also einfach nochmal wie zuvor installieren?
Und da man ja python-Symlink auf 2.5 hat passt das!?
Und wie installiere ich python 2.5 am Besten unter Debian?
Mit apt-get oder anders?
Verfasst: Freitag 12. Juni 2009, 20:19
von Leonidas
``aptitude install python2.5``
Verfasst: Samstag 13. Juni 2009, 10:35
von ferix
``aptitude install python2.5``
Gibt es da einen Unterschied zu "apt-get install python2.5"?
Gut und wenn ich das gemacht habe und Symlink für python auf 2.5 gesetzt habe. Kann ich dann Django ganz normal mit "sudo python setup.py install" nochmals installieren und dann wird es in den python2.5 site-packages installiert?
Aber wie stelle ich dann ein, dass auch nicht mehr python2.4, sondern python2.5 von Django verwendet wird?
Wie installiere ich die PIL für python2.5, da ich diese ursprünglich mal mit apt-get python-imaging installiert habe. Wird mir dann nicht gesagt, dass das Paket bereits existiert?
Entschuldige, dass ich sofrage aber ich will auf meinem Server im Netz nicht allzu sehr rumexperementieren und habe leider momentan keine Testmaschine zur Verfügung.
Verfasst: Samstag 13. Juni 2009, 14:00
von Leonidas
ferix hat geschrieben:``aptitude install python2.5``
Gibt es da einen Unterschied zu "apt-get install python2.5"?
Aptitude kann Abhängigkeiten besser auflösen, hat eine bessere UI, wird von den Debian-Leuten seit Woody oder so empfohlen, kann automatisch installierte Pakete automatisch auch wieder deinstallieren (apt-get kann das inzwischen auch, aber erst seit kurzem).
ferix hat geschrieben:Gut und wenn ich das gemacht habe und Symlink für python auf 2.5 gesetzt habe. Kann ich dann Django ganz normal mit "sudo python setup.py install" nochmals installieren und dann wird es in den python2.5 site-packages installiert?
Am einfachsten ist es, wenn du Python 2.5 installierst und eine Datei namens /usr/lib/python2.5/distutils/distutils.cfg erstellst, mit diesem Inhalt:
Code: Alles auswählen
[install]
install_lib = /usr/local/lib/python2.5/site-packages
install_scripts = /usr/local/bin
Das bedeutet nun, dass distutils ab jetzt in /usr/local installieren, wodurch /usr "sauber" bleibt. Danach installierst du easy_install für Python 2.5 und kannst dann via ``easy_install-2.5 PIL`` die PIL installieren und Django (je nachdem welche Version du willst. Ich habe mir einfach einen Mercurial-Clone in meinen Home-Ordner erstellt und dann einen Symlink in /usr/local/lib/python2.5/site-packages/django, falls du eine Release installieren willst gehts mittels easy_install auch)
ferix hat geschrieben:Aber wie stelle ich dann ein, dass auch nicht mehr python2.4, sondern python2.5 von Django verwendet wird?
Hängt ab wie du die Skripte aufrufst. Wenn du sie mittels ``python skriptname.py`` aufrufst, musst du dass in ``python2.5 skriptname.py`` ändern, wenn du sie mittels ``./skriptname.py`` aufrufst, musst du den Shebang anpassen.
ferix hat geschrieben:Wie installiere ich die PIL für python2.5, da ich diese ursprünglich mal mit apt-get python-imaging installiert habe. Wird mir dann nicht gesagt, dass das Paket bereits existiert?
Siehe oben.
ferix hat geschrieben:Entschuldige, dass ich sofrage aber ich will auf meinem Server im Netz nicht allzu sehr rumexperementieren und habe leider momentan keine Testmaschine zur Verfügung.
Dafür gibt es VMs

Verfasst: Samstag 13. Juni 2009, 14:18
von ferix
Super vielen Dank für die Erklärung. Soweit verstanden.
Das bedeutet nun, dass distutils ab jetzt in /usr/local installieren, wodurch /usr "sauber" bleibt.
Wieso sollte man das so machen?
Nicht gut sein "Zeug" in usr/lib/ direkt installiert zu haben?
Verfasst: Samstag 13. Juni 2009, 14:38
von Leonidas
ferix hat geschrieben:Nicht gut sein "Zeug" in usr/lib/ direkt installiert zu haben?
Nein, ich versuche lokale Anpassungen wirklich nur in /usr/local zu haben, der Rest von /usr ist die Sache des Paketmanagers. Wenn ich in /usr/local etwas verbocke, dann kann ich es löschen ohne Probleme zu bekommen. Und ich sehe auf im System gleich, was ich "lokal" angepasst habe.
Verfasst: Samstag 13. Juni 2009, 17:31
von ferix
Hängt ab wie du die Skripte aufrufst. Wenn du sie mittels ``python skriptname.py`` aufrufst, musst du dass in ``python2.5 skriptname.py`` ändern, wenn du sie mittels ``./skriptname.py`` aufrufst, musst du den Shebang anpassen.
Ähm gute Frage. Ich lasse Django über mod_wsgi laufen und rufe da ja keine spezifische Python-Datei auf.
Sieht so aus:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys
sys.path.append('/var/www/vhosts/domain.de')
sys.path.append('/var/www/vhosts/domain.de/website')
os.environ['DJANGO_SETTINGS_MODULE'] = 'website.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Deswegen versteh ich jetzt nicht so ganz wie ich Django sagen soll, dass es Python 2.5 anstatt 2.4 verwendet!?!?
Weil die Änderung des Symlinks hilft da ja wohl nichts.
Im Übrigen finde ich es komisch, dass man Django für jede Python Version extra installiern muss
Achso un unter lokalen Anpassungen verstehst du solche Installationen wie Django, PIL, ... was nicht über aptitude oder so läuft?
Verfasst: Samstag 13. Juni 2009, 17:49
von Leonidas
ferix hat geschrieben:Ähm gute Frage. Ich lasse Django über mod_wsgi laufen und rufe da ja keine spezifische Python-Datei auf.
Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
ferix hat geschrieben:Im Übrigen finde ich es komisch, dass man Django für jede Python Version extra installiern muss

Du kannst es ja auch nur einmal installieren und symlinken. Da Django keinen C-Code enthält, würde das wohl auch funktionieren. Aber wozu Django für Python-Versionen installieren die man sowieso nicht nutzt.
ferix hat geschrieben:Achso un unter lokalen Anpassungen verstehst du solche Installationen wie Django, PIL, ... was nicht über aptitude oder so läuft?
Ja, genau.
Verfasst: Samstag 13. Juni 2009, 18:41
von ferix
Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
Na klasse das übersteigt so langsam meine Linux-Kenntnisse. Ich sehe schon im neuen Jahr wenn ich in der Vollselbständigkeit lande werde ich versuchen mit der Administration nix mehr groß am Hut haben zu müssen ^^
http://www.aditsystems.de/
Ist ein deutscher Django-Hoster, den ich mal testen möchte.
Und momentan tuts gott sei dank auch noch Python 2.4 es drehte sich ganz ganz oben da nämlich um eine Website, die ohnehin auf einem externen Server und nicht von mir installiert wird. Ich wollte nur testen ^^
Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!?

Verfasst: Samstag 13. Juni 2009, 23:43
von apollo13
Leonidas hat geschrieben:Da Django keinen C-Code enthält, würde das wohl auch funktionieren. Aber wozu Django für Python-Versionen installieren die man sowieso nicht nutzt.
Das wäre wohl, was die pyc Files betrifft, eine etwas doofe Idee

Verfasst: Samstag 13. Juni 2009, 23:44
von apollo13
ferix hat geschrieben:Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!?

Das hat absolut null mit Django zu tun

Verfasst: Sonntag 14. Juni 2009, 10:24
von Leonidas
ferix hat geschrieben:Da müsstest du wohl mod_wsgi gegen Python 2.5 kompilieren, wenn dein System kein mod_wsgi für 2.5 mitbringt. Ich nutze mod_fcgid, da hat man das Problem nicht.
ferix hat geschrieben:Na klasse das übersteigt so langsam meine Linux-Kenntnisse. Ich sehe schon im neuen Jahr wenn ich in der Vollselbständigkeit lande werde ich versuchen mit der Administration nix mehr groß am Hut haben zu müssen ^^
So schwer ist das vermutlich nicht. Letztendlich ist das eben ein Nachteil den mod_wsgi mit mod_python teilt.
Ich nutze Djangohosting. Die haben glaub ich Python 2.5, aber ich habe mir dort lokal 2.6 installiert und das tut relativ gut.
ferix hat geschrieben:Aber wieso muss das auch so sch... umständlich sein Django zu sagen, dass es gefälligst python2.5 nehmen soll wenn man mod_wsgi nutzt!?

Na weil mod_wsgi gegen eine spezifische Python-Version kompiliert wird und man das nur durch neukompilieren ändern kann.