Python Homepage - GET Parameter auswerten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

Hallo Forum,

ich möchte ein 2.7 Python Script über den Browser mit einem oder mehreren GET Parametern aufrufen.

Beispiel: meine-page.de/test.py?par1=a

Zur Auswertung der Parameter habe ich folgendes versucht:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cgi

print "Content-Type: text/plain;charset=UTF-8"
print
print 'geht los'

form = cgi.FieldStorage() 
val1 = form.getvalue('par1', 'nix drin')
print val1
Leider klappt das nicht. Die Ausgabe ist immer "nix drin".

Könnt ihr mir da weiterhelfen, ich verzweifel langsam daran :-)

Beste Grüße

Sebastian
Zuletzt geändert von Anonymous am Donnerstag 25. Juli 2013, 19:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@sedaka: Das kann ich nicht nachvollziehen. Bei mir wird 'a' ausgegeben.
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

@BlackJack

hmmm, muß das Script dafür evtl. im cgi-bin liegen? Andere Scripte die einfach nur aufgerufen werden laufen einwandfrei.....

Danke für die Formatierung meines Post, werd ich nächstes Mal beachten!

Gruß

Sebastian
BlackJack

@sedaka: Ob es in einem bestimmten Verzeichnis liegen muss hängt vom Webserver und dessen Konfiguration ab. Aber bei Dir wird es ja anscheinend schon ausgeführt, denn ansonsten würde der Browser das Skript selbst herunterladen, und das scheint bei Dir ja nicht der Fall zu sein.

Lass Dir doch mal (zusätzlich) einfach alles ausgeben was im Fieldstorage ankommt:

Code: Alles auswählen

for key in form:
    print repr(key), ':', form.getlist(key)
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

@BlackJack

irgendwie fehlt mir da generell etwas, wenn ich

Code: Alles auswählen

print "Content-Type: text/plain;charset=UTF-8"
print

print '<html><head></head><body>'
print 'geht los'
print '</body></html>'
schreibe, bekomme ich das im Browser als Text ausgegeben. Die HTML Tags werden gar nicht vom Browser interpretiert.
BlackJack

@sedaka: Du sagst dem Browser ja auch explizit dass es sich um 'text/plain' handelt, dann stellt der das natürlich auch als Text dar. Der MIME-Type für HTML ist 'text/html'.
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

@BlackJack

ja, in der Tat - peinlich :-) Ist korrigiert.
for key in form:
print repr(key), ':', form.getlist(key)
bringt leider keine Ausgabe.

Im error.log steht auch nichts drin.

Irgendwie kommt er mit dem cgi nicht klar, obwohl Python selber ja ausgeführt wird. Muß man da noch in einer Config rumwurschteln?
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

sagt httpd.include dazu:

Code: Alles auswählen

<IfModule mod_python.c>
    <Files ~ (\.py$)>
        SetHandler python-program
        PythonHandler mod_python.cgihandler
    </Files>
</IfModule>
BlackJack

@sedaka: Ah, Du führst also gar keine CGI-Programme aus, sondern das Python-Skript über `mod_python`. Dann geht das natürlich nicht mit dem CGI-Modul.

Vergiss `mod_python`. Das wird nicht mehr weiterentwickelt und ist beim Apache-Projekt auf dem „Dachboden” gelandet. Es wird nicht mehr gepflegt und fliegt auch irgendwann raus.

Setze entweder einen ganz normalen CGI-Handler, meistens macht man das generell auf ein Verzeichnis wie ``cgi-bin/``, oder schau Dir mal WSGI und damit beim Apache `mod_wsgi` an. Das ist letztendlich bei Python die Schnittstelle die man aktuell verwendet.

Und dann vielleicht auch ein Mikrorahmenwerk wie Bottle oder Flask statt WSGI direkt zu verwenden. Oder gleich ein grosses Rahmenwerk wie Django.
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

@BlackJack

ok, danke dir für die Info. Da auf dem Server Plesk läuft lass ich da lieber die Finger von.

Ich schreib die benötigten Parameter/Values einfach in die DB, und frage im Python Script als erstes nach ob was in der DB hinterlegt wurde zum ausführen :-)

Irgendwann muß das alles sowieso auf Python 3 umprogrammiert werden, dann schau ich nochmal nach der GET Parameterübergabe.

Besten Dank auf jeden Fall für deine Unterstützung! Da hätte ich noch Tage dran gesessen :-)

Gruß und schönes Wochenende,

Sebastian
BlackJack

@sedaka: Ich weiss jetzt nicht ob ich Deinen Lösungsansatz richtig verstanden habe. Sollte der das `mod_python`-Apache-Modul enthalten, dann ist der IMHO falsch. Das Modul ist nun schon ziemlich lange tot.

Man wird mit einem Server auf dem Plesk läuft, doch ganz normales CGI verwenden können. Unzählige Webhoster bieten diese Kombination, das ist ja nichts exotisches. Dann kannst Du auch ganz normal die Abfrageparameter per `cgi`-Modul abfragen.

Und Du kannst trotzdem WSGI und entsprechende Webrahmenwerke verwenden, denn dafür gibt es in der Standardbibliothek in `wsgiref.handlers` eine passende „Brücke” zu CGI.
sedaka
User
Beiträge: 7
Registriert: Donnerstag 25. Juli 2013, 15:49

@BlackJack

ja, Plesk und/oder Ubuntu installierte mod_python mit. Ich kann das jetzt nicht ändern, bzw. will es nicht. Bis dann wieder alles läuft wie es soll können Tage vergehen. Never touch a running system! :-)

Im cgi Ordner läuft es nicht, daher mach ich es halt über Umwege.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

sedaka hat geschrieben:ja, Plesk und/oder Ubuntu installierte mod_python mit. Ich kann das jetzt nicht ändern, bzw. will es nicht. Bis dann wieder alles läuft wie es soll können Tage vergehen. Never touch a running system! :-)
"Never touch a running system" ist etwas fragwürdig wenn man Software im Internet betreibt die nicht mehr maintained wird, für die du keinen Support bekommen wirst und die möglicherweise Sicherheitslücken hat die nie geschlossen werden.
Antworten