CGI Tool (pyWeb)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten