#!/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 = \ "
{{ = 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()