#!/usr/bin/python # -*- coding: utf-8; tab-width: 4; indent-tabs-mode: nil; -*- from singleton import Singleton from template import render from functools import partial class WSGITemplate( object ): __metaclass__ = Singleton def __init__( self, basedir='' ): import os self.__basedir = os.path.normpath( os.path.join( os.path.split(__file__)[0], basedir ) ) + '/' self.__fallback_template = \ "

NO TEMPLATE DEFINED

\n" \ "{{ from pprint import pformat }}" \ "
{{ = pformat( { k:v for k,v in locals().iteritems() if k not in ('NOESCAPE','__builtins__','pformat','response') }, width=132 ) }}
\n\n" def template( self, filename=None ): def real_decorator( wsgi_application ): def wrapper( environ, start_response ): if filename: environ[ 'template' ] = partial( render, filename=self.__basedir + filename ) else: environ[ 'template' ] = partial( render, content=self.__fallback_template ) return wsgi_application( environ, start_response ) return wrapper return real_decorator class WSGIMySQL( object ): __metaclass__ = Singleton def __init__( self, dsn, *args ): import MySQLdb self.__dsn = dsn self.__pool = [ self.__newconn() ] self.__dict_cursor = MySQLdb.cursors.DictCursor def __newconn( self ): import MySQLdb return MySQLdb.connect( host = self.__dsn["HOST"], user = self.__dsn["USER"], passwd = self.__dsn["PASSWORD"], db = self.__dsn["DB"] ) def db( self, *args ): def real_decorator( wsgi_application ): def wrapper( environ, start_response ): try: conn = self.__pool.pop( 0 ) except IndexError: conn = self.__newconn() cur = conn.cursor( self.__dict_cursor ) environ['mysql.cur'] = cur try: for item in wsgi_application( environ, start_response ): yield item finally: conn.commit() self.__pool.append( conn ) return wrapper return real_decorator def __del__( self ): for conn in self.__pool: conn.close()