NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)