Seite 1 von 1

CGI Tool (pyWeb)

Verfasst: Dienstag 16. November 2004, 06:32
von mitsuhiko
Hallo,
Weil ich jetzt in nächster Zeit mehr mit CGI machen werden, habe ich mir ein Webframework gebastelt, welches Cookies, Header und Session verwaltet.

Code: Alles auswählen

# -*- coding: cp1252 -*-
# ---------------------------------------------------------------------------- #
# Python Web Framework                                                         #
# Version 0.2.1                                                                #
# (c) Copyright 2004 by Active-4 Software Developement                         #
# Cody by Armin Ronacher <armin.ronacher@active-4.com>                         #
# http://www.active-4.com                                                      #
# ---------------------------------------------------------------------------- #

from __future__ import division
import sys
import cgi
import md5 as md5sys
import cStringIO
import time
import Cookie
import os
import random
import stat

# ---------------------------------------------------------------------------- #
# Hilfsfunktion                                                                #
# ---------------------------------------------------------------------------- #
def md5(text):
    m = md5sys.new(text)
    return m.hexdigest()
def timestamp2cookie(timestamp=-1):
    if timestamp < 0: timestamp = time.time()
    return time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", time.gmtime(timestamp))
def now():
    return int(round(time.time()))
def decode_session(text):
    text = text.replace("\\:", ":")
    text = text.replace("\\n", "\n")
    text = text.replace("\\r", "\r")
    text = text.replace("\\#", "#")
    return text
def encode_session(text):
    text = text.replace(":", "\\:")
    text = text.replace("\n", "\\n")
    text = text.replace("\r", "\\r")
    text = text.replace("#", "\\#")
    return text

# ---------------------------------------------------------------------------- #
# Python Web Framework Classe                                                  #
# ---------------------------------------------------------------------------- #
class pyweb:
    def __init__(self):
        self._header = {}
        self._cookieheader = {}
        self._GET = {}
        self._POST = {}
        self._COOKIE = {}
        self._SESSION = {}
        self._FILES = {}
        
        #Session Management
        self.__SESSION_DIR = "./sessions/"
        self.__SESSION_NAME = "./sessions/sess_%SID%.txt"
        self.__SESSION_USE_COOKIE = 1
        self.__SESSION_COOKIE_LIFETIME = -1
        self.__SESSION_ID = "session_id"
        self.__SESSION_OPEN = 0
        self.__SESSION_AUTO_PRUNE = 1
        self._sessionid = None
        
        self._GetGet()
        self._GetPost()
        self._GetCookie()
        
        #Buffer umleiten
        self._Buffer = cStringIO.StringIO()
        self._old_stdout = sys.stdout
        sys.stdout = self._Buffer
        
        self.SetHeader("Content-Type", "text/html")
    def _GetPost(self):
        """
        Holt die _POST Werte und übergibt sie der self._POST Variable
        """
        form = cgi.FieldStorage()
        for s in form.keys():
            self._POST[s] = form.getvalue(s, "")
    def _GetGet(self):
        """
        Holt die _GET Werte und übergibt sie der self._GET Variable
        """
        GET = {}
        if os.environ.has_key('QUERY_STRING'):
            for i in os.environ['QUERY_STRING'].split("&"):
                i=i.split("=")
                if len(i)==1:
                    GET[i[0]] = ""
                else:
                    GET[i[0]] = i[1]

        self._GET = GET
    def _GetCookie(self):
        c = Cookie.SimpleCookie()
        if os.environ.has_key("HTTP_COOKIE"):
            c.load(os.environ["HTTP_COOKIE"])
            for s in c.keys():
                self._COOKIE[s] = c[s].value
        else:
            self._COOKIE = {}
    def Output(self):
        """
        Gibt die Header und den Seiteninhalt aus
        """
        output = ""
        #Session
        self.SessionSave()
        if self.__SESSION_AUTO_PRUNE:
            self.SessionPrune()
        
        #Header
        for s in self._header:
            output += s+": "+self._header[s]+"\r\n"
            
        #Cookie Header
        for s in self._cookieheader:
            if self._cookieheader[s][1] > -1:
                expires = "; expires "+timestamp2cookie(self._cookieheader[s][1])
            else:
                expires = ""
            if self._cookieheader[s][3]:
                secure = "; secure"
            else:
                secure = ""
            lifetime = timestamp2cookie(self._cookieheader[s][1])
            output += "Set-Cookie: "+s+"="+self._cookieheader[s][0]+"; "\
                      "path="+self._cookieheader[s][2]+expires+secure+"\r\n"
        
        #Header Ende
        output += "\r\n"
        
        #Buffer
        output += self._Buffer.getvalue()
        sys.stdout = self._old_stdout
        print output
    def SetHeader(self, name, content):
        """
        Setzt den Header
        """
        self._header[name] = content
    def GetHeader(self, name):
        """
        Gibt den Header zurück
        """
        return self._header[name]
    
    # ------------------------------------------------------------------------ #
    # Cookie Funktionen
    def SetCookie(self, name, value, expires=-1, path="/", secure=0):
        self._cookieheader[name] = (value, expires, path, secure)
    def DeleteCookie(self, name):
        old = self._cookieheader[name]
        self._cookieheader[name] = (old[0], 100, old[2], old[3])
        
    # ------------------------------------------------------------------------ #
    # Session Funktionen
    def SessionStart(self):
        if not self._COOKIE.has_key(self.__SESSION_ID):
            sid = md5(str(time.time())+str(random.random()))
            self.SetCookie(self.__SESSION_ID, sid, self.__SESSION_COOKIE_LIFETIME)
        else:
            sid = self._COOKIE[self.__SESSION_ID]
        try:
            session = file(self.__SESSION_NAME.replace("%SID%", sid)).read()
        except:
            session = "{}"
        self._SESSION = eval(session)
        self.__SESSION_OPEN = 1
        self._sessionid = sid
    def SessionSave(self):
        sid = self._sessionid
        if (self.__SESSION_OPEN):
            try:
                file(self.__SESSION_NAME.replace("%SID%", sid), "w").write(str(self._SESSION))
                self.__SESSION_OPEN = 0
                return 1
            except:
                return 0
    def SessionDelete(self):
        sid = self._sessionid
        if (self.__SESSION_OPEN):
            try:
                os.unlink(self.__SESSION_NAME.replace("%SID%", sid))
                self.__SESSION_OPEN = 0
                self._sessionid = None
                return 1
            except:
                return 0
    def SessionPrune(self, time=604800):
        success = 1
        files = os.listdir(self.__SESSION_DIR)
        for file in files:
            if os.stat(self.__SESSION_DIR+file)[stat.ST_MTIME]+time < now():
                try:
                    os.unlink(self.__SESSION_DIR+file)
                except:
                    success = 0
        return success
    
    # ------------------------------------------------------------------------ #
    # Vorgefertigte Header Befehle
    def Redirect(self,adress):
        self.SetHeader("Location", adress)
        self.SetHeader("Status", "302 Redirect")
Testen kann man es mit sowas:

Code: Alles auswählen

#!c:\python23\python.exe
# -*- coding: cp1252 -*-

import pyWeb
import httplib
import time
import random

#PythonWeb Modul initialisieren
p = pyWeb.pyweb()
p.SetHeader("Content-Type", "text/plain")
p.SessionStart()

if not p._SESSION.has_key("blablabla"):
    print "In Sessions kann man viele Werte speichern"
    print "Integers"
    p._SESSION["int"] = 45
    print "Strings"
    p._SESSION["str"] = "foobar"
    print "Listen"
    p._SESSION["list"] = ["das","ist","ein","Test"]
    print "Und vieles anderes"
    p._SESSION["blablabla"] = pyWeb.md5("test")
else:
    print "Die Werte lauten:"
    print p._SESSION["int"]
    print p._SESSION["str"]
    print p._SESSION["list"]
    print p._SESSION["blablabla"]
print ""
print "An die Url wurden folgende Werte gehängt:"
print p._GET
print "Keine Probleme mit Umlauten ggäää?"
        
#Seite ausgeben
p.Output()
Vielleicht kann es ja einer brauchen.

//Edit: Hab eine sinnlose Funktion entfernt

Verfasst: Dienstag 7. Juni 2005, 07:32
von jens
Ich habe gerad für mein CGI-Session Management mittels mySQL nach einem Beispiel zum Thema Cookies gesucht und dabei diesen alten Thread gefunden :)

Mir fällt auf, das du dir Cookies selbst zusammenbastels... Es ist aber schon einfacher eins von den fertigen Cookie-Modulen von Python zu nutzen ;) Ein Beispiel, wie es geht findet man hier: http://www.python-forum.de/viewtopic.php?t=951

Ich wollt's nur mal so Anmerken, falls jemand anderes nach cookie sucht ;)

Verfasst: Dienstag 7. Juni 2005, 14:31
von mitsuhiko
jens hat geschrieben:Ich habe gerad für mein CGI-Session Management mittels mySQL nach einem Beispiel zum Thema Cookies gesucht und dabei diesen alten Thread gefunden :)

Mir fällt auf, das du dir Cookies selbst zusammenbastels... Es ist aber schon einfacher eins von den fertigen Cookie-Modulen von Python zu nutzen ;) Ein Beispiel, wie es geht findet man hier: http://www.python-forum.de/viewtopic.php?t=951

Ich wollt's nur mal so Anmerken, falls jemand anderes nach cookie sucht ;)
Jup. Weiß ich mittlerweile auch schon :P
Man lernt eben dazu

Re: CGI Tool (pyWeb)

Verfasst: Dienstag 27. Dezember 2005, 17:28
von Gast
moin, ziemlich unsicher

den unteren text konnte cih per google "finden" also direkt die antwortenbox.... musste nur auf absenden gehn um das hier reinzuspammen ;)
also hob admin(s) behebt das mal ^^

Edit (Leonidas): Unnötigen Quote entfernt.

Re: CGI Tool (pyWeb)

Verfasst: Dienstag 27. Dezember 2005, 17:34
von Leonidas
Anonymous hat geschrieben:den unteren text konnte cih per google "finden" also direkt die antwortenbox.... musste nur auf absenden gehn um das hier reinzuspammen ;)
also hob admin(s) behebt das mal ^^
Ja, warscheinlich werden Gast-Postings demnächst deaktiviert.