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")
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()
//Edit: Hab eine sinnlose Funktion entfernt