Seite 1 von 2

Simples Formular

Verfasst: Montag 3. Januar 2011, 15:35
von sprudel
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

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 15:48
von JonasR
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?

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 15:49
von DasIch
Du könntest ein Microframework wie Flask nehmen.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 15:51
von sprudel
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 ^^

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 15:53
von JonasR
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

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 15:55
von sprudel
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.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 16:02
von JonasR
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...

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 16:34
von sprudel
Ich les mich jetzt erstmal in die oben genannten Verfahren ein, und werde berichten obs läuft :)

Vielen Dank übrigens, für eure Hilfe! :)

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 17:40
von sprudel
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?

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 17:47
von 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.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 17:49
von sprudel
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

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 18:00
von DasIch
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.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 18:08
von sprudel
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.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 18:11
von 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.

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 18:17
von sprudel
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?

Re: Simples Formular

Verfasst: Montag 3. Januar 2011, 19:28
von Leonidas
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>

Re: Simples Formular

Verfasst: Dienstag 4. Januar 2011, 17:55
von sprudel
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?

Re: Simples Formular

Verfasst: Dienstag 4. Januar 2011, 18:07
von Leonidas
Vermutlich weil der Browser den Content-Type nicht richtig erkennt. Nutz doch ein Microframework, dass sich um sowas kümmert...

Re: Simples Formular

Verfasst: Dienstag 4. Januar 2011, 22:24
von Dauerbaustelle
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?

Re: Simples Formular

Verfasst: Mittwoch 5. Januar 2011, 22:09
von noisefloor
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