kickstart.py (5709B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\contrib\kickstart.py 2 from os import path 3 from werkzeug.wrappers import Request as RequestBase, Response as ResponseBase 4 from werkzeug.templates import Template 5 from werkzeug.exceptions import HTTPException 6 from werkzeug.routing import RequestRedirect 7 __all__ = ['Request', 8 'Response', 9 'TemplateNotFound', 10 'TemplateLoader', 11 'GenshiTemplateLoader', 12 'Application'] 13 14 class Request(RequestBase): 15 16 def __init__(self, environ, url_map, session_store = None, cookie_name = None): 17 RequestBase.__init__(self, environ) 18 self.url_adapter = url_map.bind_to_environ(environ) 19 self.session_store = session_store 20 self.cookie_name = cookie_name 21 if session_store is not None and cookie_name is not None: 22 if cookie_name in self.cookies: 23 self.session = session_store.get(self.cookies[cookie_name]) 24 else: 25 self.session = session_store.new() 26 27 def url_for(self, callback, **values): 28 return self.url_adapter.build(callback, values) 29 30 31 class Response(ResponseBase): 32 default_mimetype = 'text/html' 33 34 def __call__(self, environ, start_response): 35 request = environ['werkzeug.request'] 36 if request.session_store is not None: 37 request.session_store.save_if_modified(request.session) 38 if request.cookie_name not in request.cookies: 39 self.set_cookie(request.cookie_name, request.session.sid) 40 return ResponseBase.__call__(self, environ, start_response) 41 42 43 class Processor(object): 44 45 def process_request(self, request): 46 return request 47 48 def process_response(self, request, response): 49 return response 50 51 def process_view(self, request, view_func, view_args, view_kwargs): 52 return None 53 54 def process_exception(self, request, exception): 55 return None 56 57 58 class Application(object): 59 60 def __init__(self, name, url_map, session = False, processors = None): 61 self.name = name 62 self.url_map = url_map 63 self.processors = processors or [] 64 if session: 65 self.store = session 66 else: 67 self.store = None 68 69 def __call__(self, environ, start_response): 70 if self.store is not None: 71 request = Request(environ, self.url_map, session_store=self.store, cookie_name='%s_sid' % self.name) 72 else: 73 request = Request(environ, self.url_map) 74 for processor in self.processors: 75 request = processor.process_request(request) 76 77 try: 78 callback, args = request.url_adapter.match(request.path) 79 except (HTTPException, RequestRedirect) as e: 80 response = e 81 else: 82 for processor in self.processors: 83 action = processor.process_view(request, callback, (), args) 84 if action is not None: 85 return action(environ, start_response) 86 87 try: 88 response = callback(request, **args) 89 except Exception as exception: 90 for processor in reversed(self.processors): 91 action = processor.process_exception(request, exception) 92 if action is not None: 93 return action(environ, start_response) 94 95 raise 96 97 for processor in reversed(self.processors): 98 response = processor.process_response(request, response) 99 100 return response(environ, start_response) 101 102 def config_session(self, store, expiration = 'session'): 103 self.store = store 104 105 106 class TemplateNotFound(IOError, LookupError): 107 108 def __init__(self, name): 109 IOError.__init__(self, name) 110 self.name = name 111 112 113 class TemplateLoader(object): 114 115 def __init__(self, search_path, encoding = 'utf-8'): 116 self.search_path = path.abspath(search_path) 117 self.encoding = encoding 118 119 def get_template(self, name): 120 filename = path.join(self.search_path, *[ p for p in name.split('/') if p and p[0] != '.' ]) 121 if not path.exists(filename): 122 raise TemplateNotFound(name) 123 return Template.from_file(filename, self.encoding) 124 125 def render_to_response(self, *args, **kwargs): 126 return Response(self.render_to_string(*args, **kwargs)) 127 128 def render_to_string(self, *args, **kwargs): 129 try: 130 template_name, args = args[0], args[1:] 131 except IndexError: 132 raise TypeError('name of template required') 133 134 return self.get_template(template_name).render(*args, **kwargs) 135 136 137 class GenshiTemplateLoader(TemplateLoader): 138 139 def __init__(self, search_path, encoding = 'utf-8', **kwargs): 140 TemplateLoader.__init__(self, search_path, encoding) 141 from genshi.template import TemplateLoader as GenshiLoader 142 from genshi.template.loader import TemplateNotFound 143 self.not_found_exception = TemplateNotFound 144 reload_template = kwargs.pop('auto_reload', True) 145 kwargs.pop('default_encoding', None) 146 self.loader = GenshiLoader(search_path, default_encoding=encoding, auto_reload=reload_template, **kwargs) 147 self.output_type = 'html' 148 self.encoding = encoding 149 150 def get_template(self, template_name): 151 try: 152 return self.loader.load(template_name, encoding=self.encoding) 153 except self.not_found_exception as e: 154 raise TemplateNotFound(template_name) 155 156 def render_to_string(self, template_name, context = None): 157 context = context or {} 158 tmpl = self.get_template(template_name) 159 return tmpl.generate(**context).render(self.output_type, encoding=None)