ubuntuusers.de

Anfängerprobleme mit dem Auswerten von Parametern in Python CGI-Skript

Status: Ungelöst | Ubuntu-Version: Server 12.10 (Quantal Quetzal)
Antworten |

Taigatrommel

Anmeldungsdatum:
26. Juni 2011

Beiträge: Zähle...

Hallo zusammen, ich versuche die Eingaben eines HTML-Formulars per POST an ein CGI-Skript zu senden. Ich schaffe es aber irgendwie nicht den Inhalt des POST im CGI-Skript per Python auszulesen.

Hier mein Quelltext (kopiert von http://www.elvenware.com/charlie/development/web/Python/PythonScripts.html).

Das Python CGI-Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/python

import cgi;
import cgitb
cgitb.enable()

def print_header():
	print """Content-type: text/html\n
	<!DOCTYPE html>
	<html>
	<body>"""

def print_close():
	print """</body>
	</html>"""

def display_data(param1, param2):
	print_header()
	print "<p>Param1 = " + param1 + "</p>"
	print "<p>Param2 = " + param2 + "</p>"
	print_close()

def display_error():
	print_header()
	print "<p>An Error occurred parsing the parameters passed to this script.</p>"
	print "<p>Try something like:</p>"
	print "<p><strong>http://localhost/SimpleCgi.py?param1=1&param2=2</strong></p>"
	print_close()

def main():
	form = cgi.FieldStorage()
	if (form.has_key("param1") and form.has_key("param2")):
		display_data(form["param1"].value, form["param2"].value)
	else:
		display_error()

main()

Und hier das HTML:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
    <title>Call SimpleCgi.py</title>
    <link href="index.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="/cgi-bin/test.py" method="POST">

    <div>
        <span class="rowName">Number One: </span><input name="param1" type="text">
    </div>
    <div>
        <span class="rowName">Number Two: </span><input name="param2" type="text">
    </div>

    <div><input type="submit" value="Submit Query"></div>
</form>
</body>
</html>

Ich bekomme nach Ausführung immer wieder das was die Methode display_error ausführt angezeigt. Vermutlich gibt cgi.FieldStorage() nichts zurück. Aber warum?

Ich bin blutiger Anfänger. Sicherlich handelt es sich um einen trivialen Fehler ☹ Ich finde den aber nicht ...

Vielleicht kann mir ja einer von euch hier weiterhelfen ...

Achso, das Skript und das html liegen auf einem dogado-Webspace. Laut vorherigen Fehlermeldungen handelt es sich um einen Apache 2

Danke ...

Grüße - Stefan

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Bist Du Dir auch sicher, dass Du das richtige Script aufrufst? Die URL im Formular lautet nämlich anders, als die Bezeichnungen in der py-Datei. Jetzt kann man nur raten, ob Dein Script wirklich test.py heißt. Es kann ja auch sein, dass es ein test.py gibt und eine SimpleCgi.py. Wenn Du letztere aktualisierst, wirst Du von den Änderungen natürlich nichts mitbekommen...

Du könntest Dir ja auch einfach mal (ggf. per prettyprint) den Inhalt von form ausgeben lassen; dann siehst Du evtl. schon, was da schief läuft.

Aber zum Schluss der wichtigste Hinweis: Lass dir Finger von (direktem) CGI! Benutze ein Framework, welches WSGI basiert arbeitet. Schau Dir einfach mal Django, Flask oder Bottle an. Für den spielerischen Anfang würde ich Dir Flask empfehlen, Bottle geht dafür aber auch. Wenn es dann ernster werden sollte, tu Dir einen Gefallen und benutze Django.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Lysander schrieb:

Aber zum Schluss der wichtigste Hinweis: Lass dir Finger von (direktem) CGI!

Hier bin ich ausnahmsweise mal einig mit Lysander. CGIs sind hoch gefährlich, es sind Programme die völlig eigenständig neben dem WEB-Server laufen die sich im Fall des Falles sogar root Rechte erschleichen können. Sieh dir einfach mal an welche eingebauten Scriptsprachen dein Server unterstützt. Die laufen im Regelfall in einer Sandbox des Servers, sind schneller und sicherer.

cu

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

microft schrieb:

Hier bin ich ausnahmsweise mal einig mit Lysander.

Eigentlich nicht - denn mir geht es hier nicht um Sicherheit, sondern um idiomatisches Vorgehen 😉 Er soll auf jeden Fall weiterhin Python nutzen - nur eben nicht diese (veraltete) Schnittstelle!

Sieh dir einfach mal an welche eingebauten Scriptsprachen dein Server unterstützt. Die laufen im Regelfall in einer Sandbox des Servers, sind schneller und sicherer.

Was sind denn "eingebaute Scriptsprachen"?

Antworten |