Einfache Webprogrammierung mit python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Hallo ihr.

Ich habe mir jetzt mal ein paar Python Grundlagen beigebracht. Sozusagen das "Hallo Welt", Variablen usw.

Jetzt würde ich gerne in die Webprogrammierung einsteigen, so dass ich in das Browser-Fester ausgebe statt in die Konsole.
Ich möchte Python ja als Web-Scriptsprache und Konsolenscriptsprache lernen. (Anstatt PHP und Perl)

Ich weiß, dass es verschiedene Webframeworks wie den Django gibt.
Ich will zum lernen aber mal "ganz unten" anfangen und keinen Framework benutzen wenn möglich.
Sondern so direkt wie möglich programmieren.
Gibt es außer CGI und Frameworks noch andere Möglichkeiten? Quasi so wie bei PHP, wo man ja auch ohne CGI und ohne vorgefertigtes Framework/Template System "einfach so" was machen kann.

Müsste ich dafür irgend ein Apache Modul installieren, um Python Scripts direkt über den Webserver mittels URL Aufruf ausführen zu können, wie ein PHP Script? Oder wie geht das?

Kenne mich leider noch gar nicht so gut aus. Für mich bestand die "WebserverWelt" bisher nur aus einer "Standard LAMP" Installation mit PHP, wie man es bei jedem 0815 Webhoster oder Standard-Pakete Installation hat.

P.S. Ich nutze Ubuntu in der Version 11.04 mit Python 3.
Apache und den Kram habe ich auf meinem Rechner nur in der "Standard LAMP Paket" Variante drauf.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hallo und Willkommen,

ich würde dir empfehlen mit einem "Mikroframework" wie Bottle oder Flask anzufangen. Damit kann man sehr schnell, sehr schöne Ergebnisse erzielen, ohne sich gleich mit einem großen Framework auseinandersetzen zu müssen.

Grüße
Gerrit
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Coder hat geschrieben: Ich will zum lernen aber mal "ganz unten" anfangen und keinen Framework benutzen wenn möglich.
Sondern so direkt wie möglich programmieren.
Gibt es außer CGI und Frameworks noch andere Möglichkeiten? Quasi so wie bei PHP, wo man ja auch ohne CGI und ohne vorgefertigtes Framework/Template System "einfach so" was machen kann.
Also für den Fall schau Dir mal Werkzeug an. Das ist kein Framework, sondern eine Bibliothek rund um WSGI. Damit kannst Du richtig low-level programmieren.

Allerdings: Ausgehend von Deinen Vorausetzungen empfehle ich Dir eher Django. Damit kommst Du schnell zu Ergebnissen und lernst allgemein etwas über die wichtigen Komponenten, welche letztlich alle Webapplikationen gemein haben (URL-Dispatching, Templating, DB-Anbindung, Form-Validierung, usw). Selbst wenn Du später Dein eigenes Framework bauen willst, so bringt es immer etwas, sich erst einmal mit etablierten Systemen zu befassen. Denn dann kannst Du eher abschätzen, was sinnvoll, gefährlich oder gar kontraproduktiv ist :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Noch mehr "low-level" findest du in der wgiref-Library von Python. Dort kannst du dir deine Apps auf unterster Ebene zusammenschustern und dann laufen lassen. Ist ein bisschen kompliziert.
LG Maik
lunar

@daemonTutorials: Direktes WSGI ist mehr oder weniger das genaue Gegenteil von „einfach“.
BlackJack

@Coder: Deine Anforderungen sind ein wenig widersprüchlich. Einerseits möchtest Du es möglichst ”low level” ohne Rahmenwerk und Templates, auf der anderen Seite so wie PHP — was letztendlich ein Rahmenwerk mit Templates ist! Denn wirklich ”low level” wäre CGI (oder ”moderner” WSGI), das ist aber gerade deswegen super unkomfortabel.

Ich würde auch Bottle oder Flask vorschlagen. Das sind übersichtliche Mikrorahmenwerke mit denen man sehr gut Webanwendungen kennenlernen kann, bei denen die URL nicht 1:1 auf eine Datei abgebildet wird, wie das bei CGI und PHP der Fall ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Hi.

Vielen Dank für die Infos und den guten Link.

Ich wollte gerne für den Anfang zunächst mal eine minimalistische Lösung einsetzen. Auf der möchte ich dann erst mal Erfahrungen sammeln. Python-Programmieren selbst, ohne mich groß mit einem Framework auseinanderzusetzen.

Ich brauche erst mal kein Templatesystem, Content-Management, DB-Interface usw.
Mir reicht für den Anfang erst mal "Plaintext" / HTML Ausgabe im Browser, URL + URL Parameter + GET/POST einlesen, Formulardaten einlesen, Dateizugriff und eben der Standard-Sprachkern.

Natürlich könnte ich auch CGI benutzen, aber eine Integration im Webserver wäre mir schon lieber.
Ich hätte es gerne etwa so, wie man es von einer einfachen Standard LAMP Installation mit PHP etwa gewohnt ist.

Wie funktionieren die Python Frameworks technisch gesehen? Sind das Webservermodule, die die Verbindung zwischen Webserver und Python herstellen, so wie bei PHP z.B. das Apache PHP Modul? Diese Webserver-Grundmodule haben dann ihrerseits wieder eigene Module, wie bei PHP z.B. PEAR, und so ein komfortables Gesamtwerk ergeben?

Ihr merkt schon, ich ziehe viele Vergleiche zu PHP. Das liegt aber daran, dass ich das halt schon kenne und damit schon Erfahrungen habe und einige kleine Sachen realisiert habe.
Der Grund, warum ich auf Python gehen will, ist folgender:
Ich will eine einheitliche Sprache für Shellscripts und Webprogrammierung erlernen.
Man kann zwar auch PHP+Perl machen. Aber Perl mag ich nicht. Natürlich könnte man auch PHP Shellscripte machen (womit man einheitlich PHP hätte) aber das mag ich auch nicht.

PHP soll bei mir auf einer Ebene mit HTML verwendet werden. Das heißt, ich möchte PHP+HTML nur noch für das "Design" bzw das Template benutzen, und den Rest einheitlich in Python machen.

Idealerweise sollte das also nachher so funktionieren, dass ich meinen Kern mit der kompletten Datenverarbeitung, Filesystemzugriffe, Datenbankzugriffe, und auch die Shellscripte in Python machen kann, und nur noch die Ausgabe über ein PHP Template funktioniert.
Wenn das "mist" ist, kann ich mein Webseiten-Template auch in Pyton neu machen und PHP komplett einsparen. Es ist nicht sonderlich groß und komplex.
Allerdings habe ich auch ein paar vorgefertigte PHP Lösungen in Verwendung (z.B. pbpBB), für die bräuchte ich PHP ohnehin weiterhin.

Das Konzept, alles in Python zu machen und PHP auf einer Ebene mit HTML nur noch für die eigentliche Darstellung zu benutzen (XML- basiertes Menüsystem, Ausgabe der HTML+CSS Daten, Tabellen erzeugen, Browserweichen usw), ist aber noch Zukunftsmusik.
Für den Anfang will ich erst mal direkt von Python ausgeben, für die ersten Übungen brauche ich auch noch keine Datenbank.


Viele Grüße
deets

Eben fuer genau deine Beduerfnisse ist sowas wie Bottle die beste Wahl. Es abstrahiert dir auf simple Weise von URL/Request/Formular-Daten. Das einzige, wo du irrst: du *willst* ein Template-System. Wenn du davon sprichst, PHP + Python nutzen zu wollen, wo du die Logik in Python, aber das rendern in PHP machen willst - dann ist das genau das, was ein Template-System dir bietet. Einen Weg, HTML zu schreiben, in den kleine Stuecke Code zur Ausgabe, fuer simple SChleifen & Verzweigungen eingebettet sind.

Und zusammen mit mod_wsgi + apache bist du da auch recht nahe dran am LAMP-Stack. Naeher geht eigentlich nicht.
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Hi.

Also das mit dem Python+PHP Mix war ja nur so eine Idee.
Kenne mich ja noch nicht so aus, das war das Erste, was mir so einfiel, daher bin ich froh um jeden Hinweis wie es besser geht.

Das mit der "Low Level" Programmierung und "selbstgemachten" Ausgabe ist ja auch nur mal fürs Lernen gedacht, da muss auch erstmal gar kein Template da sein, fürs Erste würde "Plaintext" Ausgabe ins Browserfenster reichen. (Ähnlich einem einfachen echo von PHP)

Der Bottle hört sich gut an, ich glaube, den werde ich mal zum Testen installieren.


P.S.
Bei Django und ähnlich "dicken" Frameworks habe ich die Befürchtung, "zu speziell" zu lernen. Zum Lernen will ich ja nicht alles abgenommen bekommen, oder mich mit Framework-spezifischen Funktionen und Bibliotheken befassen, sondern möglichst "Low Level" programmieren.

Ich will nachher keinesfalls auf ein Framework fixiert sein, sondern ich will nachträglich auch zu anderen Frameworks wechseln können, ohne nochmal "von Vorne" anfangen zu müssen.
Genau dieses Problem hatte ich bei PHP auch schon. Damals habe ich ein paar Beispiele vom Typ "Hallo Welt" durchgezogen, und bin dann gleich auf ein CMS gegangen. Ich war nachher so auf ein CMS und dessen Template/Modulprogrammierung mit den CMS-eigenen Funktionen fixiert, dass ich kaum "Natives" PHP konnte. Das "nachzulernen" war sehr mühsahm. Der Umstieg auf ein anderes System (Und später dann ein eigenes Menü+Webseitensystem) war relativ schwer.

Viele Grüße
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Python Webprogrammierung via WSGI (was DER Standard ist) funktioniert immer gleich: du definierst deine Routen, bindest an jede Route eine Funktion (bzw. mehrere Routen an eine Funktion) und bindest wiederum die Routen an eine Basis-URL. Das ist vom kleinsten bis zum größten WSGI-Framework immer gleich.

Der Rest ist halt "Komfort" bzw. das, was man für große Applikationen so wie so braucht: ein Template-System, ein ORM etc.

Der Wechsel von z.B. Bottle oder Flask auf was "dickes" wie Django ist später u.U. nicht so ohne weiteres möglich, jedenfalls nicht ohne größeren Re-Write. Das liegt z.B. daran, wie die Syntax für das Routing ist, wie stark das MVC-Konzept umgesetzt ist etc.

Sprich: Je nach dem, was du am Ende vor hast, solltest du direkt mit den richtigen Waffen lernen. Python brauchst du so wie so immer. :-)

Gruß, noisefloor
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

@noisefloor:

Hmm ok, dann ist das ähnlich wie bei PHP.
Da musste ich meine Seite bei einem CMS Wechsel auch quasi neu machen.
Ich bin ja mal von Joomla auf Drupal und dann auf Wordpress umgestiegen.
Das erste, wo ich bissl dran rum gebastelt hatte, war Drupal, in Form eines eigenen Template.
Bei Wordpress ging es dann soweit, dass ich eine Wordpress <-> phpBB Bridge gemacht habe.
Nicht komplett selber, ich hatte irgend eine Version, die nicht richtig lief wegen Versionsproblemen. Die hatte ich dann etwas gefixt und individuell angepasst.
Später habe ich mir mein eigenes Menü und meine eigene "Frontpage" gebaut.
Irgendwann habe ich dann begonnen, mal ein komplett eigenes Homepagesystem zu bauen.

Jetzt habe ich etwas anderes vor, für dass ich einiges an Background Shellscripts brauchen werde, und wo mir die klassischen CMS eh nicht viel bringen.
Ich will auch keine der fertigen Lösungen benutzen, da keine meine Anforderungen erfüllt oder "zu viel" bietet.

Ich brauche ein Webinterface, wo sich der User auf dem Server einen Account anlegen kann und seine Statistik ansehen kann.
Es handelt sich um einen Router mit VPN Concentrator, Proxy (Mit Content Filter und Quota), Filebase, kleinem Webspace, interner Mail und VoIP sowie einem WLAN DMZ.
Ich habe ein "fertiges" Adminpanel, das ist aber mehr für den Administrator gedacht. Man kann zwar alles rausnehmen was man nicht braucht, aber trotzdem sieht der User zu viele technische Details und es ist für einen normalen User auch zu kompliziert zu bedienen.
Das Ganze wird sozusagen ein "Edelrouter" / "Homeserver", der auch von unterwegs per VPN benutzbar ist. Für mich und Familie / Bekannte / Freunde.

Wenn ich mich an dieses Projekt ran setze und dafür Python erlerne, will ich auch gleich meine Homepage auf Python umbauen. Ich habe ja keinen Zeitdruck. Wenns fertig ist, ists fertig.

Ich hätte auch Perl nehmen können. Ich habe es mal probiert. Das klappte in Kombination mit einem kleinen PHP Frontend auch ganz gut, einen User und seine Verzeichnisse anzulegen, aber Perl sagt mir überhaupt nicht zu.
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Hallo.

So, ich habe es jetzt hinbekommen.
Ich kann jetzt python files über den Apache2 Webserver wie PHP Files ausführen.

Ein Framework habe ich jetzt momentan noch nicht installiert.

Ich habe es auch schon geschafft, etwas auf dem Browserfenster auszugeben.

Leider habe ich einige seltsame Effekte:

Code: Alles auswählen

#!/usr/bin/python3

def index(req):
	print ("Hallo Welt!")
	return "Test successful";
Es kommt nur Test succsessful zurück. Hallo Welt wird nicht ausgeben.

Fehlt das index(req):, dann kommt:

Not Found
The requested URL /test.py was not found on this server.

Ich habe es noch nicht hinbekommen, die Scripts so zu gestalten, dass sie sowohl im Webbrowser als auch auf der Kommandozeile funktionieren.

Naja, ich muss mal weiter lesen und probieren, vielleicht bekomme ich es so hin, dass ich eine "universelle" "Musterdatei" hinbekomme, d.H. eine die sowohl auf der Kommandozeile als auch im Webbrowser etwas ausgibt ausgibt.

Den Framework muss ich auch noch installieren, habe mich noch nicht vollends entschieden, welchen ich nehme, der Bottle macht aber schonmal einen recht guten Eindruck
deets

Coder hat geschrieben: Ich habe es noch nicht hinbekommen, die Scripts so zu gestalten, dass sie sowohl im Webbrowser als auch auf der Kommandozeile funktionieren.
Und das solltest du auch erst gar nicht versuchen.

Zum einen ist der Apache zum entwickeln ungeeignet. Ein framework wie bottle (ja, wir wiederholen uns hier ein bisschen...) erlaubt es dir, ganz schnell auf der Kommandozeile den Server zu starten & Aenderungen auszuprobieren. Sobald alles laeuft, kannst du das Skript mittels mod_wsgi in den Apache hieven, wenn's denn sein muss (ich wuerde den ja eher vermeiden...)

Und zum zweiten - und viel wichtiger in obigem Zusammenhang - solltest du lieber deine Skripte so entwickeln, dass du Module hast, die Funktionen fuer dich bereitstellen, die du brauchst. Und dann eben zB per Komandozeilen-Skript oder dem Web-Teil darauf zugreifst. Damit verringerst du auch die Gefahr, code zu erzeugen der zu viel an Umgebung vorraussetzt.
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Ja, Apache ist nicht so toll, das stimmt.
Beim Apache musste ich schon "Tricksen" mit MaxRequestsPerChild 1 damit er Änderungen übernimmt, und der Debugger ist nicht toll.


Der Bottle hat ja seinen eigenen Mini-Webserver, damit kann ich mir den Apache komplett sparen (was durchaus gewisse Vorteile hätte bei dem was ich machen will)
Hat Flask den eigentlich auch?

Ich installiere jetzt mal diesen Bottle und probiere ihn mal aus, vielleicht teste ich auch noch andere bevor ich mich entscheide
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

So, ich habe das mal ausprobiert.

Es klappt eigentlich ganz gut mit dem Bottle.

Habe jetzt erst mal das Beispiel gemacht aber mit 2 Abfragen.

Code: Alles auswählen

#!/usr/bin/python3

from bottle import route, run

print ("Bottle Test")

@route('/hello')
def hello():
    return "Hello World!"

@route('/hi')
def hi():
    return "Hi Du"

run(host='localhost', port=8080)

Es gefällt mir ganz gut.
Ich denke, mit dem Bottle bin ich im Moment sehr gut bedient.
Es ist sehr schlicht und einfach, genau so wie ich es haben wollte. Ideal für Anfänger.
Damit kann ich mich erst mal auf Python selbst konzentrieren, ohne mich mit einem großen Framework oder dem Apache auseinandersetzen zu müssen.
Den Apache packe ich auch erst mal wieder ein. Der eingebaute Server reicht mir erst mal voll aus, um die Grundlagen zu lernen und die ersten kleinen Projekte zu starten.

Ich sag dann mal Danke für die Unterstützung und die Tipps.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

AFAIK haben die meisten Webframeworks einen eingebauten Server, mit dem die schnell und einfach testen kannst. Inkl. Bottle und Flask. Im Falle von Bottle ist der Dev-Server single-threaded, d.h. für Produktiv ist das nix. Soll es aber auch nicht.

Ansonsten habe ich den Eindruck, dass du den Begriff "Webprogrammierung" unter Python überschätzt. Es ist nämlich in der Tat so, wie deets sagt, dass du so programmieren solltest, dass du Module hast, die "universell" einsetzbar sind und den Webteil in ein eigenes Modul (=die WSGI-Applikation) auslagern. Bzw.: so macht man das heute. :-)

Beispiel aus eigener Erfahrung: Ich habe diverse Webapplikation im Firmenintranet laufen (z.B. monatlicher Ergebnisdarstellung, Reklamation). Die "größeren haben vielleicht 700-800 Zeilen Code, verteilt auf ca. 5-6 Module. Die Codezeilen, welche WSGI-spezifisch sind (bzw. bei mir Bottle-spezifisch) sind, machen ca. 10% vom Code aus (Routen definieren, Request-Verarbeitung, Cookies, Response definieren usw.), der Rest ist "normales" Python.

Gruß, noisefloor
Coder
User
Beiträge: 19
Registriert: Dienstag 14. Juni 2011, 00:13

Wie trennt man am Besten die beiden Teile?

Man schreibt ein "Webscript" für Bottle, welches dann die einzelnen eigenen "module" als Funktion einbindet? Man übergibt dann die Werte mittels variablen, bzw im Funktionsaufrud und mit return?
Wenn man dann mal das Framework wechselt, braucht man nur das "webscript" neu zu machen, während die anderen Teile unverändert weiter übernommen werden können?
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Auf deine Fehlermeldung: Versuch mal folgendes:

Code: Alles auswählen

#!/usr/bin/python3

def index(req):
    msg_on_success = "Test successfully"
    output = "Hallo Welt! %s" % (msg_on_success)
    
    return output
    
Das sollte funktionieren, wenn auch der Weg über den Bottle-eigenen Webserver der beste ist, aber wenn du Bottle insoweit gar nicht nutzt, kannst du dir auch aus "http.server" den CGIHTTPServer holen und dir einen eigenen basteln. Eine Web-App von mir läuft auf einem selbst gebastelten. Und so "low-level" zu programmieren, ist für mich angenehm(Mit CGI jetzt!, WSGI ist etwas anders!)
LG Maik
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Coder hat geschrieben:Wie trennt man am Besten die beiden Teile?

Man schreibt ein "Webscript" für Bottle, welches dann die einzelnen eigenen "module" als Funktion einbindet? Man übergibt dann die Werte mittels variablen, bzw im Funktionsaufrud und mit return?
Wenn man dann mal das Framework wechselt, braucht man nur das "webscript" neu zu machen, während die anderen Teile unverändert weiter übernommen werden können?
Genau!
Du hast ein Script, dass die Module einbindet(mit import) und die entsprechend nutzt, evtl. zum Daten holen und anzeigen.
So würde ein Beispiel aussehen:
(Ohne Bottle, sonstige, ...)

Code: Alles auswählen

#!/usr/bin/python3

from mylib import sql, request

page = request.get("page")

sql.connect("blablabla")
result = sql.query("SELECT text FROM articles WHERE id = '%s'" % (page))

for row in result:
    print(row[0])

Das wäre noch am ehesten an einen PHP-Vergleich ranzuführen. Obwohl das hier schon übersichtlicher ist als der PHP-Quatsch.
Noch besser wäre allerdings eine Funktion, die das ganze dann aufbereitet und ausgibt.
Es gibt viele, viele Möglichkeiten, gerade so wie du sie benutzt und auch programmieren möchtest.

Hier das ganze mal in PHP:

Code: Alles auswählen

<?php
require_once("class.sql.php");
require_once("class.request.php");

$sql = new Sql("Connect data");
$request = new Request();

$page = $request->GET("page"):

result = sql->query("SELECT text FROM articles WHERE id = '".$page."'");

while ($row = $result->fetch_array)
{
    echo $row[0];
}
?>
Was ist kürzer und übersichtlicher?
LG Maik
Antworten