Seite 1 von 1

Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 17. März 2017, 15:03
von c0da
Hallo zusammen,

ich möchte gerne wissen, wie man Daten (z.B. einen Zahlenwert) an ein serverseitiges Phythonscript übergibt,
so, wie man es mit GET und POST aus PHP kennt.

Ich interessiere mich nicht für Frameworks oder irgendwelche optimalen aber hochkomplizierten Lösungen, sondern
möchte ganz einfach wissen, wie der Python-Code aussehen muss, um einen Wert auszulesen, den ich Beispielsweise mit HTML

Code: Alles auswählen

<form action="pythonscript.py" method="post">
Zahl: <input type="text" name="zahl" />
</form>
in die Variabele zahlaufgenommen habe.
Ich möchte den Inhalt in mein Pythonscript in die Variabele X speichern.
Wie muss der Code dazu lauten?

Danke!

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 17. März 2017, 15:22
von /me
Um dir helfen zu können müssten wir etwas mehr über deinen aktuellen Ansatz wissen. Verwendest du http.server oder wie lieferst du die HTML-Dateien aus?

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 17. März 2017, 15:48
von c0da
Die HTML Datei liegt auf dem Server, gleich neben dem Python Script.

Die Seite rufe ich mit meinem Brower mit http://www.meineseiteoderso.de auf, dann erscheint das HTML
Eingabeformular.

Ich tippe eine Zahl ein und per "Absenden" will ich diese Zahl an mein Python Script senden, welches diese
Zahl dann weiter verarbeitet.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 17. März 2017, 18:22
von BlackJack
@c0da: Dann interessierst Du Dich letztendlich doch für ein Webrahmenwerk. Da Du das aber am Anfang schon ausgeschlossen hast: Möchtest Du das nicht vielleicht doch in PHP lösen? Das ist in PHP und Python letztlich das gleiche, nur das für PHP in der Regel alles schon automagisch vorkonfiguriert ist und Du nichts mehr tun oder wissen musst. Denn auch für PHP braucht es im Webserver ein Modul das dem PHP beibringt und Einstellungen die sagen was als PHP ausgeführt werden soll.

Genauso braucht man für Python ein Modul im Webserver (`mod_wsgi`) und Einstellungen die dem Webserver sagen wo der Einstiegspunkt in die Webanwendung ist. Hier unterscheidet sich das Konzept zwischen PHP und Python dann allerdings auch schon, denn in Python passiert das nicht auf Dateibasis, sondern das Routing von URLs auf Funktionen die dann letztendlich Code ausführen wenn die URL aufgerufen wird, findet in Python-Code statt. Das kann man sich selbst programmieren, aber in der Regel wird man mindestens ein Mikrorahmenwerk wie `bottle` oder `flask` verwenden. Wobei `bottle` beispielsweise nur eine einzige Python-Datei ist, also das ist wirklich ein sehr kleines Rahmenwerk, das IMHO auch mehr Arbeit abnimmt als es durch Lernaufwand macht, denn es ist wirklich nicht kompliziert.

Schau Dir einfach mal die Bottle-Dokumentation, und dort das „Hallo, Welt!“-Beispiel an.

Neben der HTML-Datei mit dem Formular möchte man Programme übrigens nicht liegen haben. Eine kleine Fehlkonfiguration und die Benutzer können den Quelltext herunterladen.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 18. März 2017, 12:09
von c0da
Also, zunächst erst einmal danke für die Antwort. Sie ist sehr ausführlich und ich danke Dir, dass Du Deine Zeit und Dein Wissen zur Verfügung gestellt hast, mir zu antworten.

Dennoch bin ich nicht gerade wenig darüber entsetzt, dass niemand in der Lage (oder willens?) ist, meine Frage klar und einfach (am besten noch mit einer oder zwei Zeilen Code) zu beantworten! Das kann doch nicht so schwer sein!

Mir fehlen darüber einfach die Worte *Kopfschüttel*

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 18. März 2017, 12:40
von BlackJack
@c0da: Du bist anscheinend von der falschen Annahme ausgegangen, das es in anderen, allgemeinen Programmierprachen, genau so funktionieren muss wie in PHP, eine Sprache die doch recht speziell auf diesen Einsatzzweck ausgerichtet ist, und die in der Regel schon nach dem installieren entsprechend in den Webserver integriert ist, und wo es auch nur diesen einen Weg gibt, und wo die Sprache selbst schon das Webrahmenwerk ist. Bei anderen Sprachen muss man mehr Entscheidungen treffen, zum Beispiel *wie* man sie in den Webserver integrieren kann/will, und welches Webrahmenwerk man verwendet. Wenn man sich dafür entscheidet *kein* Webrahmenwerk zu verwenden, dann endet das normalerweise damit das man anfängt sich sein eigenes zu programmieren. Arbeit die man sich sparen kann.

Es sind halt nicht nur ein oder zwei Zeilen Code. Die ein oder zwei Zeilen Code die man Dir hier zeigen könnte, stehen zum Beispiel im Bottle-Tutorial im Abschnitt zum Thema <form>s. Die würden dann aber wahrscheinlich fragen zum Routing aufwerfen, und wenn man die dann beantworten würde, Fragen zum ausführen oder integrieren in den Webserver. Und bevor wir hier nach und nach im Frage/Antwort-Spiel das Tutorial für Dich vorspielen, wäre es einfacher wenn Du es selber von vorne durchgehen würdest. Oder das für Flask.

Und wenn es wirklich nur um ein <form> und ein Skript geht, das die Daten davon verarbeitet, dann ist der Aufwand den etwas anderes als PHP macht, vielleicht auch überzogen, denn die meisten anderen Sprachen sind eher etwas für Webanwendungen. Ich persönlich würde das trotzdem in Python machen, aber auch nur weil ich damit Erfahrung habe und es letztendlich doch relativ einfach zu integrieren ist, wenn man sich mal damit auseinandergesetzt hat.

Was Du vorher vielleicht auch abklären solltest ist in wie weit Dein Webspace-Anbieter Python unterstützt. Alleine das Python auf dem Server installiert ist, bedeutet nicht das man das auch frei für Webanwendungen verwenden kann. Es kann sein das der Anbieter das nur für CGI anbietet — dann kann man es IMHO gleich vergessen, oder das er nur Django als Webrahmenwerk anbietet, oder das er eine bestimmte Form der Integration in den Webserver vorschreibt.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 18. März 2017, 13:49
von kbr
c0da hat geschrieben:Mir fehlen darüber einfach die Worte *Kopfschüttel*
Bevor Du jetzt grantig wirst in der Annahme, dass hier niemand Deine 'einfache' Frage auch 'einfach' beantworten kann, solltest Du wissen: PHP ist im Grunde eine Template-Sprache. Was bei deren Nutzung hinter den Kulissen geschieht ist bei den meisten Providern bereits soweit vorkonfiguriert, dass der Anwender fröhlich html und php mischen kann und nur noch die Extension auf .php zu ändern braucht.
Das macht die Einstiegshürde in die php-Programmierung so niedrig - mit entsprechenden Folgen auf dem 'php Programmierer' Markt.

Wenn Du etwas anderes als php verwenden möchtest, *musst* Du Dich mit der Anbindung von ausführbaren Programmen an den verwendeten Webserver befassen. Da hat BlackJack Dir bereits einige Hinweise gegeben. Der Vorteil ist, dass Du lernst, dass es viele mächtige und spannende (und auch deutlich bessere) Möglichkeiten jenseits von php gibt.

Nun liegt es an Dir und Deinen Ansprüchen an Dich.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 18. März 2017, 18:13
von noisefloor
Hallo,
Dennoch bin ich nicht gerade wenig darüber entsetzt, dass niemand in der Lage (oder willens?) ist, meine Frage klar und einfach (am besten noch mit einer oder zwei Zeilen Code) zu beantworten! Das kann doch nicht so schwer sein!
Ganz einfach: mit den Restriktionen, die du dir selber stellst (im Zuge der Nutzung von Python aber ziemlich kontraproduktiv sind) ist das nicht zu lösen. Selbst, wenn du dein Python-Skript über die CGI-Schnittstelle ausführst - was aber seit min 10 Jahren eigentlich keiner mehr freiwillig macht - musst du deinen Server so konfigurieren, dass er ein Python-Skript via CGI ausführen kann.

Wie man das aber eigentlich macht, ist in den vorherigen Post ausführlich beschrieben. Aber solange du dich weigerst, ein Webframework zu nutzen, wirst du nie nie nie nie nie mit Python und Webprgrammierung glücklich. Ganz einfach, oder?

Gruß, noisefloor

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 14. April 2017, 16:57
von festus
Hi c0da,
c0da hat geschrieben:Dennoch bin ich nicht gerade wenig darüber entsetzt, dass niemand in der Lage (oder willens?) ist, meine Frage klar und einfach (am besten noch mit einer oder zwei Zeilen Code) zu beantworten! Das kann doch nicht so schwer sein!

Mir fehlen darüber einfach die Worte *Kopfschüttel*
grins...

ich benutze oder codiere (wenn man/frau das so nennen will :D) selber erst seit einer Woche oder so Python. Ich versuche mein karges Wissen mal weiterzugeben...
Soweit wie ich das sehe, funktioniert das i. d. R. auch nicht viel anders als in Perl oder PHP - wenn man/frau einfach nur mal ein Script braucht, das eine Eingabe verarbeitet. Zuerst mußt du libapache2-mod-python installieren. Ich weiß jetzt nicht, was für ein BS du hast, ich habe Debian 8.x. Ich gehe mal vom Apache2 Webserver aus, falls du einen anderen hast, mußt du dessen Config-Datei später editieren. Ich denke, du solltest das sowieso erstmal Zuhause testen. Ich gehe damit auch nicht direkt auf die Menschheit los :wink:

Code: Alles auswählen

sudo apt-get update
sudo apt-get install libapache2-mod-python
falls du dich doch irgendwann mal für ein Framework entscheidest, installiere libapache2-mod-wsgi-py3 bzw. libapache2-mod-wsgi für Python2 gleich mit, kann auf jedenfall nicht schaden:

Code: Alles auswählen

sudo apt-get update
sudo apt-get install libapache2-mod-wsgi-py3
Danach solltest du dann unbedingt die apache2.conf editieren und natürlich dort eintragen, dass jetzt auch Pythonscripte als cgi-files ausgeführt werden sollen.

Code: Alles auswählen

ScriptAlias /cgi-bin/ /var/www/
<Directory "/var/www/">
        Options ExecCGI
        AddHandler cgi-script .cgi .pl .php .py
</Directory>
Apache2 restart nicht vergesssen...

Die HTML-Datei mit dem Formular...

Code: Alles auswählen

<html>
	<body>
		<form method="post" action="drittes.cgi">
			Red<input type="checkbox" name="color" value="red">
			Green<input type="checkbox" name="color" value="green">
			<input type="submit" value="Submit">
		</form>
	</body>
</html>
und das Python-CGI-Script:

Code: Alles auswählen

#!/usr/bin/python
import cgi
form = cgi.FieldStorage()

# getlist() returns a list containing the
# values of the fields with the given name
colors = form.getlist('color')

print "Content-Type: text/html\n"
print '<html><body>'
print 'The colors list:', colors
for color in colors:
    print '<p>', cgi.escape(color), '</p>'
print '</body></html>'

Das ist alles noch nicht so ganz "koscher". Wie gesagt, ich mach das selbst erst seit einer Woche und bin auch noch auf der Suche nach der richtigen bzw. korrekten Art und Weise das zu schreiben und zu konfigurieren. Manchmal braucht es einfach nur mal einen Anfang, damit man halt irgendwo ansetzen kann. Wenn du möchtest, guckst du mal:
HIER und HIER, da habe ich auch das Script soweit her :wink: oder PM.


Viele Grüße

festus

PS.: Wenn's hilft, ich entschuldige mich schon jetzt für meine diletantischen und unausgegorenen Vorschläge.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 14. April 2017, 18:27
von noisefloor
Hallo,

@festus: was du schreibst ist so ziemlich veraltet und in Teilen falsch.

* mod_python ist tot - seit vielen Jahren. WSGI ist der de-facto Standard.
* Für CGI-Skripte brauchst du _kein_ mod_wsgi.
* CGI funktioniert zwar noch, ist aber extrem old-school. Das nimmt man eigentlich nur noch, wenn man partout keine andere Wahl hat.
* Die meisten Webframeworks bringen einen eingebauten Server mit. Für den "Hausgebrauch" und zum Entwickeln reicht das völlig. Da braucht man keinen Apache.

Sprich: wenn du dich weiter mit Webentwicklung mit Python befasst, empfehle ich dir eine "Reset & Restart". Such' dir ein Webframework aus (gängig / populär sind Django, Flask und Bottle) und leg' damit los.

Gruß, noisefloor

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 14. April 2017, 18:28
von BlackJack
@festus: mod-python benutzt kein Mensch mehr, das ist seit Jahrzehnten tot. Der ursprüngliche Autor hat das vor ein paar Jahren mal wieder ausgegraben, aber keiner hat so recht verstanden warum. Man verwendet heutzutage WSGI. Und keines dieser beiden Apache-Module hat etwas mit CGI zu tun. Das ist nicht Python-spezifisch und das benutzt heutzutage auch keiner mehr ernsthaft. Selbst wenn das das einzige ist was der Webserver könnte, würde ich persönlich meine Webanwendung gegen WSGI programmieren. Das kann man *notfalls* auch über CGI ausführen.

Die Quelle zur Apache-Konfiguration ist kompletter Unsinn. Der fordert für jede Sprache für CGI-Skripte auf die speziellen Apache-Module für die jeweilige Sprache zu installieren. Das einzig ”schöne” an CGI ist dabei jedoch gerade das der Webserver wenn er CGI unterstützt sonst *nichts* weiter über die Programmiersprache wissen muss. Man kann da wirklich *jede* Programmiersprache verwenden die von der Standardeingabe lesen und auf die Standardausgabe schreiben kann und auf Umgebungsvariablen zugreifen kann.

Was der Autor im Gegensatz zu Dir richtig gemacht hat ist die Konfiguration des CGI-Handlers vom Apache in der er nicht direkt im Document-Root das Ausführen von CGI-Dateien erlaubt. Das will man üblicherweise auf ein dediziertes Verzeichnis beschränken. Traditionell ``/cgi-bin/``. Und dort dann auch für *alle* Dateiendungen, denn in das Verzeichnis kommen nur CGI-Programme.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Freitag 14. April 2017, 21:27
von festus
Hi @BlackJack

das mit /cgi-bin/ ist klar, war hier nur weil ich dachte c0da wollte das mal kurz ausprobieren...

und @noisefloor
hm, wußte ich nicht, dass das Teil total veraltet ist. Wie geschrieben, ich mach das erst seit gut einer Woche und hab mich zuerst um ein paar grundlegende Sachen der Sprache gekümmert. Aber Fehler sind da, um begangen zu werden, sonst lernt man ja nix und das Leben wäre zu einfach ;)

Vielen Dank und Grüße

festus

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 15. April 2017, 08:00
von noisefloor
Hallo,

@festus: ich weiß ja nicht, wie du Python lernst, aber - LEIDER! - behandeln alle so gut wie alle deutschsprachigen Python Bücher noch CGI, schweigen sich über WSGI aber aus. Und das, obwohl WSGI seit vielen Jahren der Standard ist.

Nacktes WSGI, wie es in der Standardbibliothek von Python auch vorhanden ist, möchte man eigentlich nicht benutzen, weil man sich mit ziemlich viel low-level Kram rumschlagen muss. Für (nicht zu komplexe) Webanwendungen empfiehlt sich für die Einstieg wie gesagt Bottle oder Flask.

Gruß, noisefloor

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 15. April 2017, 15:00
von BlackJack
Mal als Beispiel das CGI-Beispiel mit den Checkboxen für die Farben mit `bottle`:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from bottle import request, route, template


@route('/', method='GET')
def select_colors():
    return '''\
<html>
  <body>
    <form method="POST" action="/">
      Red<input type="checkbox" name="color" value="red">
      Green<input type="checkbox" name="color" value="green">
      <input type="submit" value="Submit">
    </form>
  </body>
</html>'''


@route('/', method='POST')
def show_selected_colors():
    return template('''\
<html>
  <body>
    The colors list: {{colors}}
    % for color in colors:
      <p>{{color}}</p>
    % end
  </body>
</html>''', colors=request.params.getlist('color'))
Wobei man die HTML-Vorlagen natürlich eher in separaten Dateien speichern würde und das gemeinsame Grundgerüst für jede Seite in ein Basistemplate auslagern würde.

Re: Wie: HTML-Formular -> Python Prog auf Server?

Verfasst: Samstag 15. April 2017, 22:45
von festus
Hi,
@noisefloor ich besorg mir i. d. R. ein Buch am Anfang meistens in Deutsch, schau aber auch gerne mal in englischsprachige Tutorials rein.
Hier im Buch ist keine Web-Programmierung drin. Nur grundsätzliche Sachen wie Datentypen, Variablen, Schleifen, Funktionen und eigene Module schreiben und einbinden von Modulen etc. Ich hab C und Java gelernt und mehrere Jahre programmiert, Perl habe ich mir selbst beigebracht. Es geht eher um die Syntax und was in Python anders ist.

@BlackJack, bottle hab ich mir mal installiert, war nicht schwer und ging auch schnell, auch die Beispieldateien usw. funktionierten. Danke für das Beispiel oben :). Ich werde wohl später zu den Frameworks noch kommen, vorher sind erstmal die Sprache richtig lernen und ein paar andere Projekte angesagt.

Es macht Spass und ich finde es angenehm, damit zu programmieren :)

Viele Grüße

festus