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:

Montag 15. November 2004, 15:22

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:

Montag 15. November 2004, 15:47

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:

Montag 15. November 2004, 16:14

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:

Montag 15. November 2004, 18:09

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 15. November 2004, 18:53

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 15. November 2004, 22:01

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: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Mittwoch 26. Januar 2005, 00:49

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 26. Januar 2005, 09:25

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. Juni 2005, 22:28

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Donnerstag 30. Juni 2005, 15:18

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