Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

83 строки
2.4 KiB

  1. #!/usr/bin/python
  2. # -*- coding: utf-8; tab-width: 4; indent-tabs-mode: nil; -*-
  3. from singleton import Singleton
  4. from template import render
  5. from functools import partial
  6. class WSGITemplate( object ):
  7. __metaclass__ = Singleton
  8. def __init__( self, basedir='' ):
  9. import os
  10. self.__basedir = os.path.normpath( os.path.join( os.path.split(__file__)[0], basedir ) ) + '/'
  11. self.__fallback_template = \
  12. "<h1> NO TEMPLATE DEFINED </h1>\n" \
  13. "{{ from pprint import pformat }}" \
  14. "<pre>{{ = pformat( { k:v for k,v in locals().iteritems() if k not in ('NOESCAPE','__builtins__','pformat','response') }, width=132 ) }}</pre>\n\n"
  15. def template( self, filename=None ):
  16. def real_decorator( wsgi_application ):
  17. def wrapper( environ, start_response ):
  18. if filename:
  19. environ[ 'template' ] = partial( render, filename=self.__basedir + filename )
  20. else:
  21. environ[ 'template' ] = partial( render, content=self.__fallback_template )
  22. return wsgi_application( environ, start_response )
  23. return wrapper
  24. return real_decorator
  25. class WSGIMySQL( object ):
  26. __metaclass__ = Singleton
  27. def __init__( self, dsn, *args ):
  28. import MySQLdb
  29. self.__dsn = dsn
  30. self.__pool = [ self.__newconn() ]
  31. self.__dict_cursor = MySQLdb.cursors.DictCursor
  32. def __newconn( self ):
  33. import MySQLdb
  34. return MySQLdb.connect(
  35. host = self.__dsn["HOST"],
  36. user = self.__dsn["USER"],
  37. passwd = self.__dsn["PASSWORD"],
  38. db = self.__dsn["DB"]
  39. )
  40. def db( self, *args ):
  41. def real_decorator( wsgi_application ):
  42. def wrapper( environ, start_response ):
  43. try:
  44. conn = self.__pool.pop( 0 )
  45. except IndexError:
  46. conn = self.__newconn()
  47. cur = conn.cursor( self.__dict_cursor )
  48. environ['mysql.cur'] = cur
  49. try:
  50. for item in wsgi_application( environ, start_response ):
  51. yield item
  52. finally:
  53. conn.commit()
  54. self.__pool.append( conn )
  55. return wrapper
  56. return real_decorator
  57. def __del__( self ):
  58. for conn in self.__pool:
  59. conn.close()