Advertisement
patvdleer

Python Cheetah Tool

Jul 8th, 2014
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.43 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import cherrypy
  3. import os
  4. import types
  5. import re
  6. from Cheetah.Template import Template
  7.  
  8. __all__ = ['CheetahTemplateTool']
  9.  
  10.  
  11. class PageTemplate(Template):
  12.     """
  13.    Thank you SickBeard
  14.    """
  15.     def __init__(self, base_dir, template, *args, **KWs):
  16.         KWs['file'] = os.path.join(base_dir, template)
  17.         super(PageTemplate, self).__init__(*args, **KWs)
  18.         application = cherrypy.tree.apps['']
  19.         config = application.config
  20.         self.sbRoot = base_dir
  21.         self.sbHttpPort = config['global']['server.socket_port']
  22.         self.sbHttpsPort = self.sbHttpPort
  23.         self.sbHttpsEnabled = False
  24.         if cherrypy.request.headers['Host'][0] == '[':
  25.             self.sbHost = re.match("^\[.*\]", cherrypy.request.headers['Host'], re.X|re.M|re.S).group(0)
  26.         else:
  27.             self.sbHost = re.match("^[^:]+", cherrypy.request.headers['Host'], re.X|re.M|re.S).group(0)
  28.  
  29.         if "X-Forwarded-Host" in cherrypy.request.headers:
  30.             self.sbHost = cherrypy.request.headers['X-Forwarded-Host']
  31.         if "X-Forwarded-Port" in cherrypy.request.headers:
  32.             self.sbHttpPort = cherrypy.request.headers['X-Forwarded-Port']
  33.             self.sbHttpsPort = self.sbHttpPort
  34.         if "X-Forwarded-Proto" in cherrypy.request.headers:
  35.             self.sbHttpsEnabled = True if cherrypy.request.headers['X-Forwarded-Proto'] == 'https' else False
  36.  
  37.         #self.sbPID = str(aquapi.PID)
  38.         self.menu = [
  39.             { 'title': 'Home',            'key': 'home'           },
  40.             { 'title': 'Users',           'key': 'users'          },
  41.             { 'title': 'Config',          'key': 'config'         },
  42.         ]
  43.        
  44.     def render(self):
  45.         return unicode(self).encode('utf-8', 'xmlcharrefreplace')
  46.    
  47.    
  48. class CheetahTemplateTool(cherrypy.Tool):
  49.     _base_dir = ''
  50.    
  51.     def __init__(self, base_dir, cache_dir):
  52.         self._base_dir = base_dir
  53.         cherrypy.Tool.__init__(self, 'before_handler', self.render)
  54.  
  55.     def __call__(self, *args, **kwargs):
  56.         if args and isinstance(args[0], (types.FunctionType, types.MethodType)):
  57.             # @template
  58.             args[0].exposed = True
  59.             return cherrypy.Tool.__call__(self, **kwargs)(args[0])
  60.         else:
  61.             # @template()
  62.             def wrap(f):
  63.                 f.exposed = True
  64.                 return cherrypy.Tool.__call__(self, *args, **kwargs)(f)
  65.             return wrap
  66.  
  67.     def render(self, template = None):
  68.         cherrypy.request.config['template'] = template
  69.         handler = cherrypy.serving.request.handler
  70.         def wrap(*args, **kwargs):
  71.                 return self._render(handler, *args, **kwargs)
  72.         cherrypy.serving.request.handler = wrap
  73.  
  74.     def _render(self, handler, *args, **kwargs):
  75.         template = cherrypy.request.config['template']
  76.         if not template:
  77.             parts = []
  78.             if hasattr(handler.callable, '__self__'):
  79.                 parts.append(handler.callable.__self__.__class__.__name__.lower())
  80.             if hasattr(handler.callable, '__name__'):
  81.                 parts.append(handler.callable.__name__.lower())
  82.             template = u'/'.join(parts)
  83.             return template
  84.  
  85.         data     = handler(*args, **kwargs) or {}
  86.         page_template = PageTemplate(self._base_dir, '{0}.html'.format(template), **data)
  87.         return unicode(page_template).encode('utf-8', 'xmlcharrefreplace')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement