Hi,
MP3Dir, eine neu-implemention eines ziemlich alten Perl-skriptes (http://www.jwz.org/hacks/marginal.html), ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.
Grob zusammengefasst listet MP3Dir alle MP3 Dateien eines ordners auf, welche man dann auch abspielen kann, oder als Playlisten exportieren kann.
Hinter der kulisse steckt natürlich noch ein bisschen mehr.
Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.
Herunterladen kann man das ganze bei Github: <Klick>
Zum lesen der ID3-tags verwend ich eyeD3.
Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut. Aber die bibliotheken an sich sind, soweit wie möglich, so geschrieben, dass sie ohne grössere Umstände auch mit WSGI, oder ähnlichem, genutzt werden können.
kritik ist erwünscht, ich will ja schliesslich was dabei lernen!
mp3dir
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Bitfish!
Du kannst Cheetah auch anders benutzen. Du kannst dir eine Hauptvorlage erstellen, die das Layout der Seite darstellt. In die Hauptvorlage kannst du den Platz für einen "Block" markieren. Z.B. für den änderbaren Content. Die anderen Vorlagen können nun von der Hauptvorlage erben und müssen nur noch den "Block" durch den änderbaren Content ersetzen. So wird es zum Designen etwas einfacher.
mfg
Gerold
Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll. Und das ist dir mit MP3Dir auch hervorragend gelungen.Bitfish hat geschrieben:MP3Dir, [...] ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.
Auch hier bin ich deiner Meinung. Siehe: http://halvar.at/python/cherrypy_cheetah/Bitfish hat geschrieben:Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.
Du kannst Cheetah auch anders benutzen. Du kannst dir eine Hauptvorlage erstellen, die das Layout der Seite darstellt. In die Hauptvorlage kannst du den Platz für einen "Block" markieren. Z.B. für den änderbaren Content. Die anderen Vorlagen können nun von der Hauptvorlage erben und müssen nur noch den "Block" durch den änderbaren Content ersetzen. So wird es zum Designen etwas einfacher.
Wie man sieht, hat es auch mit CGI gut funktioniert. Vielleicht versuchst du dich auch mal an CherryPy. Damit kannst du ganz leicht eine WSGI-Anwendung erstellen, die du (WSGI-typisch) per CGI, FASTCGI, mod_python, mod_wsgi, usw. mit einem Webserver wie dem Apachen ausliefern lassen kannst. CherryPy läuft aber auch "standalone", was zum Entwickeln ein großer Vorteil ist.Bitfish hat geschrieben:Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Die keydict Standardargumente in libs/templates.py sind potenziell gefährlich. Sollte das Template Exemplar keysdict ändern wird genau dieses Dict Exemplar verändert - wird die Funktion zukünftig aufgerufen wird dann diese veränderte Dict benutzt. Da ich mich mit Cheetah aber nicht auskenne und auch nicht weiß, wie oft die Funktionen aufgerufen werden, mag es sein, daß das kein Problem darstellt.
Dankegerold hat geschrieben:Hallo Bitfish!Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll. Und das ist dir mit MP3Dir auch hervorragend gelungen.Bitfish hat geschrieben:MP3Dir, [...] ist mein erster Versuch mich in die Web-programmierung von Python einzuarbeiten.
Ja, anfangs bestand das Templates modul nur aus `string.Template`, später wollte ich eigentlich Bottle verwenden, was aber leider ein kleines problem mit dem keysdict zu haben scheint Erst später entschied ich mich, nach kurzem ausflug richtung Jinja, Cheetah zu verwenden, was in sachen Benutzbarkeit wirklich ungeschlagen ist (imho).Auch hier bin ich deiner Meinung. Siehe: http://halvar.at/python/cherrypy_cheetah/Bitfish hat geschrieben:Für die Templates habe ich Cheetah verwendet, da ich es sehr einfach zu benutzen finde.
stimmt, ist für neuere versionen auch bereits geplantDu kannst Cheetah auch anders benutzen. Du kannst dir eine Hauptvorlage erstellen, die das Layout der Seite darstellt. In die Hauptvorlage kannst du den Platz für einen "Block" markieren. Z.B. für den änderbaren Content. Die anderen Vorlagen können nun von der Hauptvorlage erben und müssen nur noch den "Block" durch den änderbaren Content ersetzen. So wird es zum Designen etwas einfacher.
auf jedenfall, das thema WSGI ist für mich aber leider (noch) ein ziemliches fremdwortWie man sieht, hat es auch mit CGI gut funktioniert. Vielleicht versuchst du dich auch mal an CherryPy. Damit kannst du ganz leicht eine WSGI-Anwendung erstellen, die du (WSGI-typisch) per CGI, FASTCGI, mod_python, mod_wsgi, usw. mit einem Webserver wie dem Apachen ausliefern lassen kannst. CherryPy läuft aber auch "standalone", was zum Entwickeln ein großer Vorteil ist.Bitfish hat geschrieben:Mangels wissen um WSGI ist das ganze mittels CGI aufgebaut.
Ich hab diese funktion bereits erfolgreich mit Jinja2, string.Template, und Cheetah getestet - aber ich denk, ich verstehe was du meinst. Nur ist mir so ein fall zum glück bisher noch nicht bekanntstr1442 hat geschrieben: Die keydict Standardargumente in libs/templates.py sind potenziell gefährlich. Sollte das Template Exemplar keysdict ändern wird genau dieses Dict Exemplar verändert - wird die Funktion zukünftig aufgerufen wird dann diese veränderte Dict benutzt. Da ich mich mit Cheetah aber nicht auskenne und auch nicht weiß, wie oft die Funktionen aufgerufen werden, mag es sein, daß das kein Problem darstellt.
Beispiel:
"Is" prüft ob ein Exemplar genau das selbe ist wie ein anderes. Es existiert nur ein Standardargument, und das verteilst du dann an alle Templates, die erstellt werden. Das ist bestimmt nicht was du willst? Der gängige Weg, soetwas zu verhindern, ist, den default einfach auf None zu setzen, in der Funktion darauf zu prüfen und dann ein neues Dict zu erstellen. (Oder, je nach Verwendung und Nutzen der Funktion, gleich ein Callable zu übergeben, welches dann ein entsprechendes Objekt zurückliefern soll - aber für diesen Anwendungsfall ist das eher unangebracht).
Code: Alles auswählen
In [1]: class PseudoTemplate(object):
...: def __init__(self, mydict):
...: self.mydict = mydict
...: self.mydict[self] = 42
...:
...:
In [2]: def dummy(keydicts={}):
...: mytemplate = PseudoTemplate(keydicts)
...: return mytemplate
...:
In [3]: a = dummy()
In [4]: b = dummy({"x": 10})
In [5]: c = dummy()
In [6]: print a.mydict
{<__main__.PseudoTemplate object at 0xb77d10ec>: 42, <__main__.PseudoTemplate object at 0xb77d15ec>: 42}
In [7]: print b.mydict
{'x': 10, <__main__.PseudoTemplate object at 0xb77d108c>: 42}
In [8]: print c.mydict
{<__main__.PseudoTemplate object at 0xb77d10ec>: 42, <__main__.PseudoTemplate object at 0xb77d15ec>: 42}
In [9]: print c.mydict is a.mydict
True
In [10]: dummy.func_defaults
Out[10]:
({<__main__.PseudoTemplate object at 0xb77d10ec>: 42,
<__main__.PseudoTemplate object at 0xb77d15ec>: 42},)
In [11]: dummy.func_defaults[0] is a.mydict
Out[11]: True
Code: Alles auswählen
def dummy(keydicts=None):
if keydicts is None:
keydicts = {}
# ...
Darüber kann man streiten ...gerold hat geschrieben:Ich vertrete die Meinung, dass jeder, der sich mit Webprogrammierung auseinandersetzen möchte, zuerst einmal CGI verstehen und mindestens ein kleines CGI-Programm schreiben soll.
Findest du? Mich persönlich schreckt schon die "main()"-Funktion ab ... zu lang, zu große if-Blöcke, Code-Duplizierung. Für den Rest, den ich mir nicht angesehen habe, lässt das zumindest auf fehlende Strukturierung schließen.Und das ist dir mit MP3Dir auch hervorragend gelungen.
Unicode-unterstützung ist vorhanden, die etlichen Songs mit umlauten im Titel werden bei mir problemlos angezeigt.jerch hat geschrieben:Wie stehts um Unicodeunterstützung? Sonderzeichen kommen in Tags und Dateinamen relativ häufig vor.
Von "perfekt" ist das ganze auch noch seeeehr weit entfernt.lunar hat geschrieben:Findest du? Mich persönlich schreckt schon die "main()"-Funktion ab ... zu lang, zu große if-Blöcke, Code-Duplizierung. Für den Rest, den ich mir nicht angesehen habe, lässt das zumindest auf fehlende Strukturierung schließen.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also das URL-Dispatching in der main() sieht wirklich nicht so toll aus. Aber imho ist es doch eigentlich ganz gut als Einstieg, da sich der OP nun einfach mal ein Framework angucken könnte und dann festellen wird, wie leicht das damit realisiert werden könnte Denn was motiviert besser zum Lernen, als wenn man sich selber verbessern kann?