Cookies, Post, Get und Header

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
Sorgenkind
User
Beiträge: 34
Registriert: Samstag 24. Juli 2004, 19:25
Kontaktdaten:

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:
Zuletzt geändert von jens am Montag 4. Juli 2005, 15:48, insgesamt 2-mal geändert.
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Antworten