Webentwicklung - wie am besten anfangen

Django, Flask, Bottle, WSGI, CGI…
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Hallo.
Ich möchte gerne in die Python-Webentwicklung einsteigen. Bloß wenn ich mir Frameworks wie Plone oder Django runterlade, verstehe ich zum größten Teil nur Bahnhof und komme mit den vielen Dateien/Code nicht richtig klar.

Wie fange ich dies bzgl am besten an?

Ich möchte z.B. ein kleine Online Gästebuch schreiben, wie soll ich da vorgehen. Ist anscheinend nicht so einfach wie PHP

Mfg
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es ist anders wie PHP.

Schau dir mal bottle oder Flask an.

bottle.paws.de
flask.pocoo.org


Da sollten einfache Beispiele drin sein und es gibt auch tutorials.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ist anscheinend nicht so einfach wie PHP
Klar ist das einfach. :-)

Nimm' eins der beiden o.g. Frameworks, definieren zwei Routen (eine für die Eingabe, eine für die Anzeige), bau' zwei Templates (eins für die Eingabe, eins für die Anzeige) und fertig ist das ganze - zumindest in einer minimalistischen Variante.

Gruß, noisefloor
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sync32 hat geschrieben:Ist anscheinend nicht so einfach wie PHP
Nun man kann es genauso "einfach" machen wie in PHP, indem man CGI benutzt und die Webseite eben per `print` ausgibt.
Aber das will man eigtl nicht machen.
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Ich hätte dazu auch eine Frage: gibt es eigentlich auch unter Python etwas zu QuickForm und PHP vergleichbares, mit dem man die Formularverarbeitung vereinfachen kann und das sich mit einem der hier genannten Microframeworks verbinden lässt?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Flask und Bottle 0.8 können mir Bordmitteln doch die Inhalt von Forms aus der Post-Data rausholen...

Gruß, noisefloor
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Es geht mir ja nicht darum, die Inhalte der Felder aus dem Formular herauszuholen - dass das geht, davon bin ich ausgegangen und dafür bräuchte man auch in PHP kein extra Paket.
QuickForm zeichnet sich in erster Linie dadurch aus, dass zum Beispiel Pflichtfelder als solche gekennzeichnet werden können und man sich nicht darum kümmern muss, dass entsprechende Fehlermeldungen ausgegeben werden, wenn diese leer bleiben. Das Formular wird erneut angezeigt und alle Felder, die bereits ausgefüllt wurden, werden automatisch mit den bereits getätigten Eingaben befüllt und die Felder mit fehlenden Angaben optisch hervorgehoben. Auch die Verarbeitung von Optionslisten, Radiobuttons usw. ist enorm vereinfacht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Vielleicht hilft dir http://wtforms.simplecodes.com/

Flask kann das IIRC gut integrieren.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich fange auch gerade an. Webprogrammierung in Python ist nicht schwerer als mit PHP, es ist nur anders. Einzige Schwierigkeit ist, einen Hoster zu finden. Aber auch da gibt es hier einige Tipps.

Die genannten Frameworks sind schon ganz gut. Ich werde Flask verwenden. Das macht einen runden Eindruck und ist immer noch überschaubar. Django ist halt 3 Nummern größer. Flask schafft den Spagat zwischen minimalistisch schlank und komfortabel

wtforms ist in Flask auch schon integriert. http://flask.pocoo.org/docs/patterns/wtforms/

Die Dokumentation ist zwar in Englisch, aber verständlich geschrieben und umfangreich. Die Entwickler von Bottle und Flask geistern hier im Forum umher, man kann also immer fragen.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

So ich habe mich nun für Bottle entschieden. Gefällt mir gut.

Ich wollte gerade fragen, wie ich das mit den Formularauswertungen mache aber in dieser Sekunde fällt es mir glaube ich ein:

Ich mach mir ne Route "/auswerten".
DAnn binde ich ganz normal mein html-Formular ins Template ein und verlinke die Ausführung (action="...") einfach zur Route

Bloß wie wertet man das in Python aus?
Bei PHP gibts dafür nen [GET]_

Edit:
Ah hab gerade das Tutorial (http://bottle.paws.de/page/tutorial) entdeckt. Werde es mal durcharbeiten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sync32 hat geschrieben: Bloß wie wertet man das in Python aus?
Bei PHP gibts dafür nen [GET]_
Im Tutorial wirst Du im Abschnitt 'Using GET and POST Values' fündig werden.
wtforms wurde Dir ja schon empfohlen; damit kannst Du eben die Validierung ziemlich automatisieren und ggf. hübsche Fehlermeldungen rendern lassen. Ich weiß allerdings nicht, inwiefern die Kopplung zwischen wtforms und bottle reibunsglos klappt. Aber vermutlich wird das bottle-request Objekt da stimmig sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Sync32 hat geschrieben: Bloß wie wertet man das in Python aus?
Kommt drauf an. :-) entweder Framework (s.o.) oder von Hand. Wenn du nur wenig Felder hast ist es Ermessenessache, ob du sowas wie wtforms brauchst oder nicht.

An den Inhalt der Felder kommst du ja mit

Code: Alles auswählen

bottle.request.GET.get('name_des_feldes')  #für GET-Methode
bottle.request.POST.get('name_des_feldes')  # für POST Methode
bzw. über

Code: Alles auswählen

bottle.request.forms.get('names_des_feldes') # ab Bottle 0.8.x
dran.

Die Validierung sollte dann auch kein Problem mehr sein.

Gruß, noisefloor
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ja nun sehe ich es auch. Ist ja alles sehr schön auf der Bottleseite dokumentiert.
Hätte ich ja auch vorher drauf kommen können, dass ich da fündig werde. ;) *sorry*
Trotzdem danke für eure Hilfe.

Nochmal ne generelle Bottle Frage:

Wie funktioniert @route eigentlich hinter den Kulissen?
Nach dem URL Aufruf wird kontrolliert , ob sich diese URL irgendwo als @route im Pythoncode befindet:
Wenn nicht -> #404
Wenn ja -> Den Code darunter ausführen oder woher weiß er das, was er ausführen soll? Also er nimmt immer den Code, der sich unter @route('/lalala') befindet?
BlackJack

@Sync32: `route()` ist eine Dekoratorfunktion, die wird ausgeführt nachdem die ``def``-Anweisung ausgeführt wurde, die damit "dekoriert" wird. Ich nehme mal stark an, dass die Route und die dekorierte Funktion irgendwo in einem globalen Dictionary hinterlegt werden. Aber das kannst Du Dir doch auch im Quelltext anschauen wie `route()` implementiert ist.

Edit: Mal ganz primitiv die Idee:

Code: Alles auswählen

ROUTES = dict()

def route(path):
    def decorator(func):
        ROUTES[path] = func
        return func
    return decorator


@route('/add')
def add(a, b):
    return a + b


@route('/sub')
def sub(a, b):
    return a - b


def main():
    for route in ['/add', '/sub', '/gibtsnicht']:
        print ROUTES.get(route, lambda *args: '404')(5, 10)


if __name__ == '__main__':
    main()
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ok danke.
Hab noch eine Frage.
Wie man nun Daten ein- und ausließt aus einer SQL Datenbank weiß ich nun.
Aber wie werden unter Python Loginsysteme geschrieben?
Gibts da wie bei PHP Sessiona oder so?
BlackJack

Sync32: Für Sessions gibt's mindestens eine WSGI-Middleware. Gleich der erste Eintrag in der Bottle-FAQ: http://bottle.paws.de/page/faq
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du in eine Datei loggen willst -> es gibt ein logging-Modul.

Gruß, noisefloor
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sync32 hat geschrieben:Aber wie werden unter Python Loginsysteme geschrieben?
Gibts da wie bei PHP Sessiona oder so?
Also man nutzt Sessions aber überlicherweise schreibt man sowas nicht selbst sondern nutzt ne Authentifizierungs-Middleware.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben:
Sync32 hat geschrieben:Aber wie werden unter Python Loginsysteme geschrieben?
Gibts da wie bei PHP Sessiona oder so?
Also man nutzt Sessions aber überlicherweise schreibt man sowas nicht selbst sondern nutzt ne Authentifizierungs-Middleware.
Wobei wir das Thema neulich erst hatten und etwas wirklich tolles niemand präsentieren konnte. Evtl. kannst Du uns da etwas empfehlen? In flask ist das ganze ja bereits enthalten, weswegen ich in Zukunft wohl eher darauf aufbauen würde, als auf bottle.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Hyperion hat geschrieben:Wobei wir das Thema neulich erst hatten und etwas wirklich tolles niemand präsentieren konnte. Evtl. kannst Du uns da etwas empfehlen? In flask ist das ganze ja bereits enthalten, weswegen ich in Zukunft wohl eher darauf aufbauen würde, als auf bottle.
Wenn ich mir die Definition von "Sessions" [1] bei Flask so anschaue, hat Bottle das auch. Es heißt nur anders (Secure Cookies) und funktioniert wie stink normale Cookies, nur das man nen Python Objekt statt eines Strings übergibt [2] und der Client die Daten nicht ändern kann. Nen wrapper dafür, der das wie "Sessions" aussehen lässt, wäre schnell geschrieben. Ich finde diese Art nur zu beschränkt (Cookies dürfen nicht beliebig groß werden) um das wirklich "Session" zu nennen. In jedem anderen Framework versteht man unter Sessions eher etwas anderes: Serverseitig gelagerte Daten, die eben NICHT bei jedem Request mit übertragen werden müssen und NICHT vom Client einsehbar sind.

[1] http://flask.pocoo.org/docs/quickstart/#sessions
[2] http://bottle.paws.de/docs/dev/api.html ... set_cookie
Bottle: Micro Web Framework + Development Blog
Antworten