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

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@daemonTutorials: Und jetzt bitte in einer Version, die nicht für SQL Injections anfällig ist. Prepared Statements zu nutzen ist doch gerade in Python unheimlich einfach.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Oder besser gleich ein ORM nehmen... Und doch Templates... Also doch besser direkt mit Django anfangen... ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

cofi hat geschrieben:@daemonTutorials: Und jetzt bitte in einer Version, die nicht für SQL Injections anfällig ist. Prepared Statements zu nutzen ist doch gerade in Python unheimlich einfach.
Sorry, hatte erst kürzlich was mit SQL und Python zutun und da habe ich 'sqlite3' benutzt und das war in einer abgeriegelten Web-App für den HomePC. Da musste ich über das nicht nachdenken.

Also, eine Frage: Wie macht man "Prepared Statements"?
Ich habe die ID schon über '%' eingefügt, wie weiter?
Ach und bei PHP, da habe ich es total vergessen, sorry!
LG Maik
deets

Nee, nicht wirklich. Die haben ja keine SQL-Injection verbrochen, sondern authentizitaet mit authorisation gleichgesetzt. Sicher auch ein beliebter Fehler (siehe zB den "Facebook-Killer" Diaspora), aber noch ein klitzekleines bisschen besser als SQL-Injection.
deets

daemonTutorials hat geschrieben: Also, eine Frage: Wie macht man "Prepared Statements"?
Das Prinzip ist ganz simpel:

Code: Alles auswählen

cursor.execute(statement, (p1, p2, ...))
In dem statement muessen dann ebenfalls Platzhalter vorkommen. Leider ist das abhaenging von der verwendeten Datenbank (ein weiterer Grund, SQLAlchemy zu benutzen).

ZB "select * from table where column = %s" fuer mysqj. Dabei ist egal, was der Parameter fuer einen Typ hat! Das %s ist immer ein Platzhalter fuer jeden Typ.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Coder hat geschrieben:Wie trennt man am Besten die beiden Teile?
Wie alles andere bei Python auch: das ganze in kleine Häppchen unterteilen und mit entsprechenden Modulen / Klassen / Funktionen bereitstellen.

Im Falle einer Webapplikation wäre das: die "Hauptdatei", welcher per WSGI eingebunden wird. Hier werden die Routen definiert und die zur Route gehörige Funktion. Ein eigenes Modul (bzw. mindestens Funktionen), welches die "Datenverarbeitung" vornimmt. Was auch immer "Datenverarbeitung" ist (Berechnung, PDF generieren, Datenbankanbindung etc.). Und mindestens ein Template, was dann zum Generieren der Ausgabe dient.

MVC-Prinzip halt. Jetzt wird vielleicht auch klar, warum Django bei einem neuen Projekt drei Dateien anlegt (AFAIK). :-)

Gruß, noisefloor
Antworten