Simples Formular

Django, Flask, Bottle, WSGI, CGI…
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hallo,

ich würde gerne meinen Benutzern ein simples Formular anbieten, um ihr Systempassword (Linux Server) zu ändern.
Das Backend in Python ist bereits geschrieben,
nun möchte ich aber (eine ganz schlichte Seite) anbieten, wo der Benutzer eben seinen Benutzernamen, sein altes wie sein neues Passwort eintippt.
Ich möchte mich jetzt eigentlich nicht in Django oder vergleichbar komplexe Frameworks einlesen, das Script darf ruhig dirty geschrieben sein, da es nur eine Übergangslösung ist.

Wie kann ich einfach HTML-Code ausgeben (das war doch def main() ?) , sowie POST-Variablen empfangen?

Das muss doch auch ohne Django gehen :)

Viele liebe Grüße und vielen Dank.

Chris
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Also wenn ich auf google.de gehe und "python web" eingeben das erste Ergebnis auswähle und noch einen Klick mache kommt das: http://wiki.python.org/moin/CgiScripts

Hoffe es ist das was du suchst :P

Edit: Wieso unbedingt mit Python?
Zuletzt geändert von JonasR am Montag 3. Januar 2011, 15:50, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du könntest ein Microframework wie Flask nehmen.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Python ist eben meine absolute Lieblingssprache ;)

Ich habe lange lange mit PHP gearbeitet, und kann mich fast schon als Experte in der Sprache bezeichnen... aber habe zwischenzeitlich nen richtigen Graus damit was zu schreiben ^^
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

sprudel hat geschrieben:Python ist eben meine absolute Lieblingssprache ;)

Ich habe lange lange mit PHP gearbeitet, und kann mich fast schon als Experte in der Sprache bezeichnen... aber habe zwischenzeitlich nen richtigen Graus damit was zu schreiben ^^
Das stimmt ich finde Python auch um einiges schöner als PHP, aber für ein solch simples Script ist der Aufwand in PHP sicherlich geringer :D
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Das Backend ist eben in Python geschrieben (mittels der paramiko-Bibliothek, wie ich finde einfach nur genial!) :)
Ich wüsste jetzt nicht, wie ich das sauber anbinden soll.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Ich denke mal du kannst einfach bei einem Aufruf des Python Scripts in dem PHP Script etwas mitgeben.... ist ja dann nur text der als "Eingabevariable" rüberkommt... Ist nur eine Vermutung ^^ Bevor ich mich hier verrede versuche es am besten doch mit der Python Variante von Dasich oder von mir...
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Ich les mich jetzt erstmal in die oben genannten Verfahren ein, und werde berichten obs läuft :)

Vielen Dank übrigens, für eure Hilfe! :)
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Ich hab es jetzt erstmal so weit hingekriegt, dass ich nach einem bestimmten Tutourial (http://ghantoos.org/howto-apache2-mod_python/) einen Code hingebastelt habe.

Code: Alles auswählen

def index():
        return """
<HTML>
<HEAD>
<TITLE>****** Passwort&auml;nderung</TITLE>
</HEAD>
<BODY>
<B>&Auml;nderung des Systempasswortes (inkl. Mail)</B>
<br /><br />

<FORM VALUE="data" METHOD="post" ACTION="chgpassword.py/check">
<TABLE>
<TR><TH>Feld</TH><TH>Wert</TH></TR>

<TR><TD>Benutzername</TDDarwinmail.de><TD><INPUT TYPE="text" NAME="username" /></TD></TR>
<TR><TD>Altes Passwort</TD><TD><INPUT TYPE="password" NAME="old"></TD></TR>
<TR><TD>Neues Passwort</TD><TD><INPUT TYPE="password" NAME="new1"></TD></TR>
<TR><TD>Neues Passwort (wdh.)</TD><TD><INPUT TYPE="password" NAME="new2"></TD></TR>
<TR><TD>&Auml;nderungsvorgang</TD><TD><INPUT TYPE="submit" VALUE="&uuml;bermitteln"></TD></TR>
</TABLE>

</BODY>
</HTML>"""

def check(form):
        data = form.data

Jetzt meldet er mir nur folgende Meldung:

(...)
TypeError: check() takes exactly 1 argument (0 given)
(...)

Hat jemand ne Idee was ich noch falsch gemacht habe?
BlackJack

@sprudel: `mod_python` würde ich ja nicht mehr verwenden. Das ist tot -- der Autor entwickelt das nicht mehr weiter und es ist bei Apache im "attic" gelandet.

Verwende lieber CGI oder ein Mikrorahmenwerk wie Bottle oder Flask.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hmm, das erfahre ich auch erstmal jetzt ;)

Aber mal ne Frage... selbst wenn es tot ist... es würde theoretisch funktionieren, und ist auf meinem Server installiert. Was spricht dagegen es für diese kleine Aufgabe zu verwednen?

Ein Framework möchte ich nicht extra installieren, da ich meinen Server doch recht minimalistisch halten möchte... jeglichen zusätzlichen Balast möchte ich vermeiden, da es ein Produktivserver ist!


Aber okay, ich versuche mich jetzt mal genauer in das cgi einzulesen :)
Wirkt nur fast etwas zu komplex, im Vergleich zur mod_python
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

sprudel hat geschrieben:Aber mal ne Frage... selbst wenn es tot ist... es würde theoretisch funktionieren, und ist auf meinem Server installiert. Was spricht dagegen es für diese kleine Aufgabe zu verwednen?
Du wirst Probleme haben Hilfe dazu zu bekommen und Bugs sowie Sicherheitslücken werden nicht mehr behoben.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Oh mann, wenn ich das gewusst hätte.... hätte ich PHP genommen.

Diese ganzen Frameworks wie Flask starten ja gleich nen eigenen Webserver, und müssen ewig laufen.
Ich möchte aber eigentlich ganz wie gewohnt (die mod_python habe ich hier schon ewig aktiv, sagt mir ja keiner dass die uralt ist),
über www.server.de/script.py mein Script aufrufen :)
CGI scheint irgendwie nicht installiert zu sein, oder aktiviert zu sein. Jedenfalls meldet er da jedes Mal aufs neue, dass die Datei nicht existieren würde. Was natürlich absoluter Quatsch ist.

Kennst sich hier jemand zufällig auch noch etwas mit der Linux-Serververwaltung aus? Damit ich wenigstens dieses CGI aktivieren könnte.
BlackJack

@sprudel: Bottle und Flask sind *Mikro*rahmenwerke. Bottle ist zum Beispiel nur eine einzelne *.py-Datei, deren Installation auch darin bestehen kann sie einfach in das selbe Verzeichnis zu kopieren. Muss halt bei einem ``import`` gefunden werden. Harte Abhängigkeit ist nur die Standardbibliothek. Und ein kleines Template-System ist da auch schon drin.

Und weder Flask noch Bottle *müssen* als eigener Server laufen. Das ist halt nur praktisch beim Entwickeln, weil man dafür dann keinen "fetten" Webserver oder Admin-Rechte dafür benötigt.

Bei CGI ist die Frage wie der Webserver konfiguriert ist. Ob er `.py` als Dateiendung akzeptiert und ob die Datei(en) in Verzeichnissen liegen, in denen CGI-Skripte ausgeführt werden dürfen.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Wie kann ich Bottle denn nutzen (den hätte ich jetzt probeweise mal installiert),
ohne ihn als eigenen Server laufen zu lassen?

Das wäre übrigens meine default-site:

Code: Alles auswählen

<VirtualHost *:80>
        ServerName www.darwinmail.de
        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
                AddHandler mod_python .py
                PythonHandler mod_python.publisher
                PythonDebug on
                Options Indexes FollowSymLinks MultiViews ExecCGI
                AllowOverride AuthConfig FileInfo Indexes Limit
        </Directory>

</VirtualHost>
Was müsste ich da noch aktivieren?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Achja, nicht vergessen die Seite gegen CSRF abzusichern... gerade wenn es darum geht ein Passwort zu *ändern*.

Und das mod_python tot ist, ist nicht erst seit gestern bekannt. Hier im Forum wurde seit *Jahren* davon abgeraten, noch bevor es von Apache & Co als tot deklariert wurde.

Microframework und CGI, in der Flask-Dokumentation ist direkt ein Beispiel dazu. In der von Bottle ebenfalls.

In Apache schaut das dann wohl so aus (Ungetestet, aus der Apache-Dokumentation übernommen):

Code: Alles auswählen

<VirtualHost *:80>
        ServerName www.darwinmail.de
        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks Indexes FollowSymLinks MultiViews ExecCGI
                AllowOverride AuthConfig FileInfo Indexes Limit
                AddHandler cgi-script .cgi .py
        </Directory>
</VirtualHost>
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

So, jetzt habe ich das ganze mal mittels CGI umgesetzt.

Code: Alles auswählen

#! /usr/bin/env python
#encoding: utf8
import cgi,cgitb

print """
Content-type: text/html\r\n\r\n
<HTML>
<HEAD>

(...)

"""



Das Problem: Er möchte die Datei vom Server immer downloaden.
Gedownloadet wird aber nur die Ausgabe, also der Inhalt von der geprinteten Variable, nicht der gesamte Pythoncode.

Hat jemand noch ne Idee woran das liegt?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vermutlich weil der Browser den Content-Type nicht richtig erkennt. Nutz doch ein Microframework, dass sich um sowas kümmert...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Offensichtlich will er ja die Schmerzen, HTTP-Responses von Hand zu schreiben...

Ich denke mal dir fehlt ein HTTP/1.1 200 OK vor den Headern, oder? Oder macht CGI automagisch 200?
Benutzeravatar
noisefloor
User
Beiträge: 4250
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Hat jemand noch ne Idee woran das liegt?
Weil dein Server nicht so konfiguriert ist, dass er erkennt, dass er Python-Skripte ausführen soll?

Gruß, noisefloor
Antworten