|
- #!/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 = \
- "<h1> NO TEMPLATE DEFINED </h1>\n" \
- "{{ from pprint import pformat }}" \
- "<pre>{{ = pformat( { k:v for k,v in locals().iteritems() if k not in ('NOESCAPE','__builtins__','pformat','response') }, width=132 ) }}</pre>\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()
|