Ist Python für Webprogrammierung geeignet?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
amc
User
Beiträge: 3
Registriert: Freitag 14. August 2009, 12:13

Hallo,

nachdem ich mich jetzt einige Jahre mit PHP beschäftigt habe, möchte ich mich jetzt einer anderen Sprache zuwenden. Diese sollte natürlich auch für die Webprogrammierung geeignet sein, das heißt ich möchte z.B. die Möglichkeit haben, simple Scripts zu schreiben und die dann im Webserver aufzurufen.

Da Google (und auch YouTube) ja angeblich Python im Backend laufen haben, kam mir Python so in den Sinn.

Jetzt möchte ich natürlich wissen, ob Python überhaupt für die Webprogrammierung geeignet ist? Wenn ja, nur mit einem passenden Framework oder besteht auch die Möglichkeit, so ein kleines PHP-Script in Python zu realisieren?

Code: Alles auswählen

<?php

for&#40;$i = 0; $i < 10; $i++&#41; &#123;
    echo '<b>' . $i . '</b><br />';
&#125;

?>
Und wie würde das dann aussehen?

Schonmal vielen Dank,
amc
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Klare Antwort: Ja, Python ist für die Webentwicklung geeignet.

Allerdings muss Du Dich von der simplen PHP-Sicht lösen, bei der Code in HTML-Seiten eingebettet ist. Es gibt ein große Zahl an Frameworks und Techniken, mit denen in Python Webanwendungen entwickelt werden können (siehe [wiki]Python und die Webentwicklung[/wiki]). Deinem Beispiel entsprechender Code ist je nach verwendetem Framework unterschiedlich.

Siehe auch http://www.python-forum.de/topic-7063.html
https://www.xing.com/go/invite/18513630.6a91d4
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei grad der oben gezeigte Code auch bei Python indirekt durch div. Template-Sprachen möglich ist. Speziell bei Templates gibt es natürlich auch die Diskussion, wie viel Logik und Algorithmik da reingehört.

Obiges PHP-Beispiel könnte z.B. in Jinja2 so aussehen (Man muss ja nur von außen sequence übergeben):

Code: Alles auswählen

{% for index in sequence %}
  <b>{{ index }}</b><br/>
{% endfor %}
amc
User
Beiträge: 3
Registriert: Freitag 14. August 2009, 12:13

Das ist doch schonmal schön zu hören, dann werde ich wohl gleich mal ein Buch bestellen. :)

Wie funktionieren diese Template-Engines denn intern? Wenn ich die foo.py (oder keine py?) im Webbrowser aufrufe, was passiert dann genau, damit der Browser den fertigen HTML-Code zurück bekommt?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

amc hat geschrieben:Das ist doch schonmal schön zu hören, dann werde ich wohl gleich mal ein Buch bestellen. :)
Vorsicht bei Büchern! Suche mal im Forum danach. Dort gibt es viele Threads, in denen man erkennen kann, welche empfehelnswert sind und welche nicht. Speziell das OpenBook von Galileo ist eher nicht zu gebrauchen. Es gibt aber vor allem auch viel gutes im Netz, wie A-Byte-of-Python o.ä.
Wie funktionieren diese Template-Engines denn intern? Wenn ich die foo.py (oder keine py?) im Webbrowser aufrufe, was passiert dann genau, damit der Browser den fertigen HTML-Code zurück bekommt?
Als Anfänger in Python solltest Du auf ein komplettes Framework zurückgreifen, wo es alles von Hause aus mitgeliefert wird, wie z.B. Django.

Hier kannst Du vieles nachlesen; imho sehr gut erklärt und für Anfänger geeignet:
[wiki]Python im Web[/wiki]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Fuer die Anfaenge (sorry, englische Tastatur) kannst du dir auch eines der einfacherern Frameworks ansehen. Botte z.B. (siese Signatur).

Der grosse Unterschied zwischen PHP und den meisten Python Frameworks ist, das bei Python ein einziges Programm fuer alle URLs zustaendig ist und nicht wie bei PHP jede URL ein anderes Script anspricht. Die URL hat also bei Python ueberhaupt garnichts mit der Verzeichnisstruktur deines Programmes zu tun. Du hast volle Kontrolle darueber, welche URL du wie behandelst. Sowas wie ModRewrite ist bei Python absolut ueberfluessig.

Ein weiterer Unterschied ist, das sich Python wegen der besonderen Bedeutung der Whitespaces eher schlecht als Template-Sprache eignet. Daher verwaltet eine normale Python Web-Anendung lediglich die Daten und ueberlaesst das zusammenkleben der HTML-Fragmente einer Template-Engine (wie mako, cheetah und co). Viele PHP-Projekte machen das aber auch, da es generell Sinn macht, Logik von Praesentation zu trennen.

Genau wie PHP braucht Python ein Plugin im Webserver, wenn du es mit Apache verwenden moechtest (ModPython). Im Gegensatz zu PHP kann Python aber auch seinen eigenen Web-Server bereit stellen. Auch da gibt es einiges an Auswahl.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Defnull hat geschrieben: Genau wie PHP braucht Python ein Plugin im Webserver, wenn du es mit Apache verwenden moechtest (ModPython).
Wobei ModPython ja nun nicht wirklich empfehlenswert ist. Wenn man auf WSGI setzt, dann bietet sich ModWSGI an oder eben man geht über normales CGI oder FastCGI.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Hyperion hat geschrieben:
Defnull hat geschrieben: Genau wie PHP braucht Python ein Plugin im Webserver, wenn du es mit Apache verwenden moechtest (ModPython).
Wobei ModPython ja nun nicht wirklich empfehlenswert ist. Wenn man auf WSGI setzt, dann bietet sich ModWSGI an oder eben man geht über normales CGI oder FastCGI.
Stimmt allerdings. Ich nutze selbst auch meistens ein setup mit pound (load balancer) und mehreren lokal laufenden Bottle Instanzen mit fapws3 als HTTP Server Komponente.
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hier mal das Beispiel in eher funktionale Schreibweise für CherryPy, das gleich auch noch seinen eigenen Webserver mitbringt und daher so komplett lauffähig ist.

Code: Alles auswählen

import cherrypy
 
class NullBisNeun(object):
    @cherrypy.expose
    def index(self):
        return "<br/>".join("<b>%s</b>" % i for i in range(10))

cherrypy.quickstart(NullBisNeun())
Bottle ist auch ganz nett, allerdings macht defnull es mir noch zu schwer, ein Template zu definieren. Auch bottle ist sofort lauffähig, allerdings sollte man den Standard-Server von Python nur zur Entwicklung benutzen und dann später Apache o.ä. mit mod_wsgi benutzen.

Code: Alles auswählen

from bottle import route, run
from bottle import SimpleTemplate

start = SimpleTemplate()
start.parse("""
<html>
<body>
%for i in range(10):
    <b>{{i}}</b><br />
%end
</body>
</html>
""")

@route('/')
def index():
    return start.render() 

run(host='localhost', port=8080)
Stefan
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hui, mir gefällt, wie CherryPy das löst. :)

@sma: Wie würde man CherryPy sagen, dass er die Ausgabe jeweils in <body>-Elemente packen soll? Gibt's da auch irgend ne coole Möglichkeit?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

amc hat geschrieben:Jetzt möchte ich natürlich wissen, ob Python überhaupt für die Webprogrammierung geeignet ist? Wenn ja, nur mit einem passenden Framework oder besteht auch die Möglichkeit, so ein kleines PHP-Script in Python zu realisieren?

Code: Alles auswählen

<?php

for($i = 0; $i < 10; $i++) {
    echo '<b>' . $i . '</b><br />';
}

?>
Und wie würde das dann aussehen?
Ja das geht z.B. als cgi-Script, besser ist aber meist einer der oben genannten Vorschläge.

Hier mal ein 100%iger Klon deines PHP-Schnipsels, weitere Funktionen wie z.B. Zugriff auf Parameter findest du im cgi-Modul.

Code: Alles auswählen

#!/usr/bin/env python

import cgitb; cgitb.enable() # gibt Tracebacks als HTML aus, 
                             # NUR zum Testen verwenden.

print "Content-type: text/html" # Standard bei PHP, auch wenn er in
print                           # diesem Fall nicht auf den Inhalt zutrifft ;)

for i in xrange(10):
    print '<b>' + str(i) + '</b><br />'
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snafu hat geschrieben:Wie würde man CherryPy sagen, dass er die Ausgabe jeweils in <body>-Elemente packen soll?
Hallo snafu!

Das kommt dann auf die eingesetzte Vorlagensprache ab und wie man sie integriert. Vielleicht ist das hier noch interessant für dich: http://halvar.at/python/cherrypy_cheetah/

mfg
Gerold
:-)

PS:

- http://www.python-forum.de/viewtopic.ph ... tah#133276
- http://www.python-forum.de/viewtopic.ph ... tah#132756
- http://www.python-forum.de/viewtopic.ph ... tah#123515
- http://paste.pocoo.org/show/100807/

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

sma hat geschrieben:Bottle ist auch ganz nett, allerdings macht defnull es mir noch zu schwer, ein Template zu definieren. Auch bottle ist sofort lauffähig, allerdings sollte man den Standard-Server von Python nur zur Entwicklung benutzen und dann später Apache o.ä. mit mod_wsgi benutzen.

Code: Alles auswählen

from bottle import route, run
from bottle import SimpleTemplate

start = SimpleTemplate()
start.parse("""
<html>
<body>
%for i in range(10):
    <b>{{i}}</b><br />
%end
</body>
</html>
""")

@route('/')
def index():
    return start.render() 

run(host='localhost', port=8080)
Stefan
Das geht auch kürzer:

Code: Alles auswählen

from bottle import route, run
from bottle import SimpleTemplate

tpl_string = """
<html>
<body>
%for i in range(10):
    <b>{{i}}</b><br />
%end
</body>
</html>
"""

tpl = SimpleTemplate(tpl_string)

@route('/')
def index():
    return tpl.render() 

run(host='localhost', port=8080)
Oder besser (da Templates dann auch gecached werden)

Code: Alles auswählen

from bottle import route, run, template

tpl_string = """
<html>
<body>
%for i in range(10):
    <b>{{i}}</b><br />
%end
</body>
</html>
"""

@route('/')
def index():
    return template(tpl_string)

run(host='localhost', port=8080)
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Defull, ich hatte `template("Hallo, Welt")` ausprobiert und da das nicht dein Kriterium für ein Template (muss \n, { oder % enthalten) erfüllt, ging ich davon aus, dass `template()` immer einen Dateinamen erwartet. Das Verhalten der Funktion ist, hm, überraschend. Ich halte außerdem die Variante mit der expliziten `tpl`-Variable für effizienter, denn diese cacht natürlich auch das Template und umgeht die `template`-Methode, die ein Template unter seinem kompletten Source als Key in einem dict ablegt.

Stefan
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

sma hat geschrieben:die ein Template unter seinem kompletten Source als Key in einem dict ablegt.
Das ist etwas, das man noch verbessern könnte, ja ;)
Bottle: Micro Web Framework + Development Blog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich habe vorhin das github-Projekt geforkt und werde mal ein bisschen am Code rumändern... ;) Ich wollte schon immer mal ausprobieren, wie ein Pull-Request funktioniert.

Stefan
Antworten