Seite 1 von 1
HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 11:12
von inips
Hallo
Ich bin Python-Neuling, arbeite die Grundlagen durch und stehe nun vor einem Problem, für das ich keinen Lösungsansatz finde. Da ich die Grundlagen von Python verstehen will, möchte ich wenn möglich kein Framework benutzen, sondern Python pur verwenden. Ich habe Python 3.9 und Windows 10 installiert.
Meine Aufgabe:
Ich möchte ein HTML-Formular erstellen und die dort eingetragenen Daten schliesslich in eine SQL-Datenbank speichern. Das Speichern in die Datenbank werde ich wahrscheinlich selbst zustandebringen, aber wie kommen die Daten per POST vom Formular zum nächsten Script?
Ich kenne von PHP Folgendes:
Ich erstelle ein Formular in HTML mit dem Anfangstag z.B.:
Das bedeutet, mit dem Absenden des Formulars wird das Script output_form.php aufgerufen und die Formulardaten werden für den Benutzer unsichtbar mitgegeben. Z.B. könnte mit
der Vorname übergeben werden.
Auf der nächsten Seite output_form.php kann ich ganz einfach auf diese Variablen zugreifen, z.B. mit
Dem Script output_form.php ist es dabei völlig egal, wie die Seite heisst, von der es aufgerufen wurde.
In Python scheint das irgendwie anders zu funktionieren. Was ich glaube, herausgefunden zu haben: Das Script, das die Formulardaten erhalten soll, muss wissen, wie das Script mit dem Formular heisst. Das scheint mir unlogisch. Oder ist das in Python nicht der gleiche Ansatz wie in PHP?
Natürlich kann ich selbst weitersuchen. Aber welche Suchbegriffe (z.B. nach Modulen) bringen mich weiter? Ich lande bisher immer bei einem irgendeinem Framework, möchte aber wie oben beschrieben im Moment noch kein solches einsetzen - ausser natürlich wenn es nicht anders geht.
Danke für Hinweise.
Gruss, Inips
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 12:24
von Sirius3
Warum sollte die Funktion, die die Formulardaten verarbeitet etwas über die Funktion, die das Formular erstellt wissen müssen? Wie kommst Du drauf? Was hast Du schon versucht?
Und welches Framework benutzt Du für HTTP? Denn HTTP ohne Framework benutzten zu wollen ist Unsinn. Lese Dich mal in Flask ein, das beantwortet dann hoffentlich die meisten Deiner Fragen.
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 12:34
von noisefloor
Hallo,
möchte ich wenn möglich kein Framework benutzen, sondern Python pur verwenden.
Kann man für Webprogrammierung machen, wenn man stark masochistisch veranlagt ist. Macht aber keiner. Benutz' ein Framework wie Flask. Da nimmt dir ja auch "nur" das Senden der Response ab und hilft dir beim Parsen der Daten, wenn ein POST-Request kommt, der Formulardaten hat. Das HTML der Webseite an sich, dass validieren der Formulardaten und das Schreiben in eine DB musst du trotzdem selber erledigen.
Bzw. wenn du mit Formularen arbeitest, möchtest du vielleicht auch ein Formularframework wie Wtforms nehmen.
Gruß, noisefloor
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 13:49
von inips
Danke für die Antworten.
@Sirius3
Ich habe in der Datei "03a_input-form.py" das Formular erstellt, und zwar mit dem Tag
Das gesamte Formular ist in einer Variable gespeichert und wird mit print() ausgegeben. Das funktioniert insofern, als dass beim "Senden" die Seite "03b_output-form.py" aufgerufen wird.
Dann habe ich nach Modulen gegoogelt und bin z.B. auf
urllib gestossen. Die Beispiele sind aber alle aufgebaut nach dem Muster:
Code: Alles auswählen
from urllib import request
req = request.Request('https://postman-echo.com/post', method="POST")
Es muss also die aufrufende Seite angegeben werden.
Dasselbe habe ich zu
httplib gefunden, z.B.:
Code: Alles auswählen
params = urllib.urlencode(params)
con = httplib.HTTPConnection('api.sandbox.gengo.com')
Deshalb bin ich darauf gekommen, dass das aufgerufene Script das aufrufende kennen muss. Andere Beispiele habe ich nicht gefunden oder möglicherweise auch übersehen.
Versucht habe ich dann nichts, weil ich zunächst nicht diesen Ansatz weiterverfolgen wollte.
@noisefloor
Ich bin nicht masochisitsch veranlagt, habe jedoch bei einer für mich neuen Programmiersprache immer versucht, zuerst den puren Code zu begreifen, bevor ich ein Framework benutzte. Wenn das im Zusammenhang mit Formularen und POST-Variablen unter Python nicht sinnvoll ist, kann ich natürlich von Anfang an ein Framework dazu verwenden. Zu Flask habe ich schon mal was gelesen und werde das nun noch vertiefen, Wtforms schaue ich mir gerne auch noch an, denn ich werde einige Formulare brauchen.
Gruss, inips
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 14:47
von sparrow
Unabhängig von POST und Formularen: Nimm für die Webprogrammierung ein Framework. Es macht keinen Sinn, das von Hand zu stricken.
Wie hier bereits gesagt wurde: Arbeite dich in Flask ein.
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 14:59
von noisefloor
Hallo,
wenn dir total danach ist, dann kannst du natürlich das `wsgiref` Modul von Python nehmen und selber was implementieren. Dabei lernst du aber eher wenig über Python, sondern in erster Linie erstmal, wie du Header etc. gem. HTTP-Spezifikation für einen validen Response implementierst. Kann man machen, aber in der Regel ist dafür die eigene Lebenszeit zu schade
Zur Frage: So funktioniert das nicht mit Python. Der Standard für Webapplikation in Python ist WSGI, darauf setzen auch die ganzen Frameworks auf. Via WSGI wird, vereinfacht gesagt, eine Python-Funktion an eine URL gebunden. D.h. wenn du z.B die Funktion `foo()` an die URL `http://meine_tolle_domain.de/irgendwas` bindest, dann wird beim Aufruf dieser URL die Funktion `foo()` ausgeführt.
Der Browser weiß davon nichts - muss er auch nicht. Der Browser korrespondiert ja einfach nur via HTTP mit dem Server und Python läuft serverseitig.
Darum ist `<form action="03b_output-form.py" method="post">`auch unsinnig, bei `action` muss die URL stehen, an die die Daten per POST-Reqest gesendet werden. Auf dem Server nimmt deine Funktion die Daten dann entgegen und macht was damit.
Gruß, noisefloor
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 15:03
von __blackjack__
@inips: `urllib.Request` und `httplib.HTTPConnection` sind die falsche Richtung. Du willst doch keine Anfrage an einen anderen Webserver schicken, sondern selbst Anfragen beantworten.
Man kann ”pures” Python ohne mindestens ein Mikro-Webrahmenwerk nicht sinnvoll mit PHP vergleichen, denn bei PHP ist das Webrahmenwerk ja schon fest in PHP eingebaut. Die Sprache wurde genau dafür entwickelt und bietet von Haus aus schon eine Menge Funktionalität für genau diesen Einsatzzweck. Python dagegen ist eine allgemeine Programmiersprache, die nicht auf einen speziellen Anwendungsfall ausgerichtet ist.
In Python ist es auch unüblich, dass die URL eine Datei, also ein Python-Modul direkt anspricht. Deine "action" ist also komisch, Du verwendest da anscheinend CGI — damit kannst Du gleich wieder aufhören, das benutzt man nicht. Das ist ein absoluter Notnagel und selbst wenn der Webserver nur CGI anbietet, würde man gegen WSGI programmieren, denn das kann man notfalls auch über CGI ausliefern lassen.
Falls Du bei ”purem” Python bleiben willst, wäre dass das `wsgiref`-Modul. Da würde man bestimmte Sachen aber selbst erfinden müssen, die das externe `werkzeug`-Modul bietet. Ich würde nichts selbst implementieren wollen was es dort schon gibt, wenn es dafür keinen triftigen Grund gibt. Und dann wären wir auch schon bei den Mikro-Rahmenwerken wie Bottle oder Flask. Das ist IMHO das sinvolle Minimum das man mit PHP vergleichen kann, beziehungsweise unter das ich nicht gehen würde wenn man eine Webanwendung schreiben möchte. Wenn man da drunter geht wird man entweder eine deutlich schlechtere Anwendung schreiben, oder unnötigerweise Sachen selbst programmieren die es dort bereits gibt. Bei Webanwendung und schlecht kommt auch immer dazu, das schlecht hier auch oft unsicher bedeutet und man damit sich selbst und andere im Internet gefährden kann.
Anmerkung zum Dateinamen: Python-Dateien sind Python-Module. Die Namen sollten a) syntaktisch korrekte Modulnamen sein, also beispielsweise nicht mit Ziffern anfangen und keinen Bindestrich enthalten, und sich b) an die Namenskonventionen halten.
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Freitag 8. Januar 2021, 16:20
von /me
inips hat geschrieben: Freitag 8. Januar 2021, 11:12
Oder ist das in Python nicht der gleiche Ansatz wie in PHP?
Nein, das ist es nicht. In Python hast du keinen Mix aus HTML und Python Code. Wenn du HTML haben willst, dann muss dein Python Script das ausgeben. Optimalerweise verwendet man dabei ein Template-System um die Ausgabe dynamisch anpassen zu können. Zudem muss dein Script sich auch noch um die komplette HTTP-Kommunikation kümmern.
Genau das ist der Grund warum man so etwas nicht selber schreibt. Wirklich nicht. Es ist schön, die Grundlagen von Python verstehen zu wollen, aber diese Stelle hier ist der falsche Ansatz dafür. Verwende ein Framework wie Django, Flask oder bottle.
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Samstag 9. Januar 2021, 15:22
von inips
Herzlichen Dank für die erhellenden Erklärungen. Es hilft mir schon sehr weiter zu wissen, dass php und Python unterschiedlich funktionieren, jetzt verstehe ich auch einige Informationen in Tutorials besser als vorher.
Ich habe aber noch eine Anschlussfrage: Den Beginn mache ich mit einem Webprojekt, ich möchte aber später auch für den Desktop (Windows) und möglicherweise für den Raspberry Pi programmieren. Wäre es da sinnvoller, mich im Moment mit einem kleinen Framework wie Flask zu beschäftigen, um "pythonnah" zu bleiben, oder würdet ihr mir doch eher gleich Django empfehlen?
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Samstag 9. Januar 2021, 16:07
von __blackjack__
@inips: Django ist ja nicht ”pythonfern”, das ist auch ganz normal Python was man da programmiert. Da ist die Frage eher was es für Rahmenbedingungen bei dem Webprojekt gibt, ob man dafür eher Django oder Flask verwenden würde. Django bietet eine Menge schon fertig. Wenn man das braucht und verwenden kann, macht es Sinn das auch zu verwenden. Bei Flask ist das mehr ein Baukasten bei dem man sich das was Django schon dabei hat, noch dazu holen muss. Vielleicht braucht man vieles davon nicht, oder man möchte die Auswahl haben etwas anderes zu nehmen als das Rahmenwerk liefert. Dann kann Flask Sinn machen. Es gibt aber auch bei Flask zusätzliche Module die man installieren kann, die quasi so etwas wie Standardkomponenten sind. Eine Anbindung an WTForms, SQLAlchemy, und ähnliches beispielsweise.
Re: HTML-Formular => POST-Variablen übernehmen
Verfasst: Samstag 9. Januar 2021, 17:16
von noisefloor
Hallo,
ich möchte aber später auch für den Desktop (Windows) und möglicherweise für den Raspberry Pi programmieren.
Dann brauchst du weder Python noch Flask, wenn du GUI-Anwendungen programmieren willst. Dann brauchst du ein GUI-Framework wie Tkinter, Qt, GTK, Kivy etc.
Gruß, noisefloor