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 :lol:

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.