Seite 1 von 1
Cookies, Post, Get und Header
Verfasst: Montag 15. November 2004, 15:22
von mitsuhiko
Hallo,
Ich versuche gerade Python auf meinem Webserver einzusetzten.
Ich hab jetzt einige Funktionen gesetzt, die eine Seite ausgeben, Header modifizieren, Cookies setzen...
Nur ich habe noch einige Probleme.
1.) Wie kann ich den Header, den mir der Client an meine cgi Datei sendet auswerten, bzw.: mit welcher Funktion krieg ich den raus?
2.) Momentan lese ich get und post mit dem Code aus:
Code: Alles auswählen
def _GetGet:
form = cgi.FieldStorage()
for s in form.keys():
self._GET[s] = form.getvalue(s, "")
Funktioniert, aber da werden Get und Post Befehle gleichzeitig ausgewertet.
Kann ich die nicht unterscheiden?
3.) Wie kann ich Cookies auslesen? Ich nehme an, dass die im Header übermittelt werden, aber wie gesagt, ich bin noch am Verzweifeln, wie ich den herausbekomme...
Regards,
blackbird
Verfasst: Montag 15. November 2004, 15:47
von Sorgenkind
Umgebungsvariablen befinden sich in os.environ
zb os.environ["HTTP_COOKIE"]
aber python+cgi ist sehr langsam...
gerade import sachen verlangsamen ungemein... weil bei jedem aufruf der ganze pythonpfad nach dem modul abgesucht wird...
wenns dir möglich ist solltest du mod_python verwenden
Verfasst: Montag 15. November 2004, 16:14
von mitsuhiko
Das hab ich jetzt auch schon gefunden:
So läuft es:
Code: Alles auswählen
def _GetCookie(self):
c = Cookie.SimpleCookie()
c.load(os.environ["HTTP_COOKIE"])
for s in c.keys():
self._COOKIE[s] = c[s].value
Verfasst: Montag 15. November 2004, 18:09
von mitsuhiko
Also für meine Zwecke ist die CGI Version schnell genug und mein Hoster (Hosteurope) hat nur die CGI Version im Angebot.
Für die Erzeugung von einer Million md5 Hashes benötigt die CGI Version rund 9.5 Sekunden, die PHP Version etwa 8.5 Sekunden.
So viel Unterschied ist da nicht.
Verfasst: Montag 15. November 2004, 18:53
von Leonidas
blackbird hat geschrieben:Für die Erzeugung von einer Million md5 Hashes benötigt die CGI Version rund 9.5 Sekunden, die PHP Version etwa 8.5 Sekunden.
So viel Unterschied ist da nicht.
Das hat sorgenkind auch nicht gemeint, mit großen Programmen ist es ja nicht so schlimm, aber mit kleinen Programmen ist die Startzeit des Python Interpreters über CGI enorm im Vergleich zum dauernd laufenden PHP bzw. mod_python.
Verfasst: Montag 15. November 2004, 22:01
von jens
Ich hab dazu schon mal eine fertiges Skript geschrieben, weil ich es auch doof fand, das zum einen in
os.environ['QUERY_STRING'] Daten stecken und zum anderen in
cgi.FieldStorage()
Diese Funktion packt einfach beide in ein Dict. Natürlich muß man bei den Formular-Feld-Namen und URL-Parameter auf doppelte Namen achten
s. auch code weiter
unten
Code: Alles auswählen
import os
def GetCGIdaten():
"CGI POST und GET Daten zur einfacheren Verarbeitung zusammen in ein Dict packen"
CGIdaten={}
if os.environ.has_key('QUERY_STRING'):
# POST URL-Parameter parsen
for i in os.environ['QUERY_STRING'].split("&"):
i=i.split("=")
if len(i)==1:
if i[0]!="":
CGIdaten[ i[0] ] = ""
else:
CGIdaten[ i[0] ] = i[1]
from cgi import FieldStorage
FieldStorageData = FieldStorage()
# GET Daten auswerten
for i in FieldStorageData.keys():
CGIdaten[i]=FieldStorageData.getvalue(i)
return CGIdaten
Ist wahrscheinlich nicht die eleganteste Art das zu machen: Verbesserungsvorschläge erwünscht
Verfasst: Mittwoch 26. Januar 2005, 00:49
von XT@ngel
Hi,
Kann es sein das cgi.FieldStorage() nur mit einer Methode (POST/GET) klarkommt?
Also entweder kommen Daten per POST oder GET, beides zur gleichen Zeit ist aber nicht möglich?
MfG
andreas
Verfasst: Mittwoch 26. Januar 2005, 09:25
von jens
XT@ngel hat geschrieben:Also entweder kommen Daten per POST oder GET, beides zur gleichen Zeit ist aber nicht möglich?
Kann sein, weiß ich jetzt garnicht mehr. Aber egal, mit meinem Skript bekommt man halt immer die Daten egal ob POST oder GET gemacht wurde. Denn es werden immer
os.environ.has_key('QUERY_STRING') und
cgi.FieldStorage() ausgewertet.
Ich wollte noch was zur Ausführungszeit mit normalem CGI was sagen. Ich bin ja auch bei hosteurope. Ich hab festgestellt, das es schon länger dauert, bis der Interpreter gestartet ist, aber nur beim ersten Aufruf. Danach geht es recht fix weiter! Ich denke er wird dann einfach nur aus dem Cache geladen, was man kaum merkt...
Verfasst: Mittwoch 29. Juni 2005, 22:28
von jens
Ha, nach dem Studium von andern Source-Codes ist mit aufgefallen, das man sich die Sache wesentlich vereinfachen kann... Denn es gibt ja für
FieldStorage() den Parameter
keep_blank_values, den ich bisher nicht kannte...
Code: Alles auswählen
import os, cgi
def GetCGIdaten():
"CGI POST und GET Daten zur einfacheren Verarbeitung zusammen in ein Dict packen"
CGIdaten={}
FieldStorageData = cgi.FieldStorage( keep_blank_values=True )
for i in FieldStorageData.keys():
CGIdaten[i]=FieldStorageData.getvalue(i)
return CGIdaten
Das Funktioniert allerdings nicht mit Python 2.2.1, obwohl es in der Doc zu 2.2.3 angegeben ist:
http://www.python.org/doc/2.2.3/lib/node297.html
Verfasst: Donnerstag 30. Juni 2005, 15:18
von BlackJack
XT@ngel hat geschrieben:Hi,
Kann es sein das cgi.FieldStorage() nur mit einer Methode (POST/GET) klarkommt?
Also entweder kommen Daten per POST oder GET, beides zur gleichen Zeit ist aber nicht möglich?
Das ist aber keine Beschränkung von `cgi.FieldStorage()` sondern von HTML. Entweder man schickt die Daten per POST, oder per GET. Beides ist im Protokoll nicht vorgesehen.