pvl/web/application.py
changeset 164 2c66ab45d91e
parent 151 8a9f01036091
child 178 f9f5e669bace
equal deleted inserted replaced
163:96d551b90734 164:2c66ab45d91e
     8 
     8 
     9 import logging; log = logging.getLogger('pvl.web.application')
     9 import logging; log = logging.getLogger('pvl.web.application')
    10 
    10 
    11 class Application (object) :
    11 class Application (object) :
    12     """
    12     """
    13         Main state.
    13         Main wsgi entry point state.
    14     """
    14     """
    15 
    15 
    16     URLS = None
    16     URLS = None
    17 
    17 
    18     def __init__ (self, urls=None) :
    18     # TODO: charset
       
    19 
       
    20     def __init__ (self, urls=None, layout=None) :
    19         """
    21         """
    20                 urls        - werkzeug.routing.Map -> Handler
    22                 urls        - werkzeug.routing.Map -> Handler
       
    23                 layout      - template with {TITLE} and {HEAD} and {BODY}
    21         """
    24         """
    22 
    25 
    23         if not urls :
    26         if not urls :
    24             urls = self.URLS
    27             urls = self.URLS
    25 
    28 
    26         if not urls :
    29         if not urls :
    27             raise ValueError("No URLS/urls=... given")
    30             raise ValueError("No URLS/urls=... given")
    28 
    31         
       
    32         self.layout = layout
    29         self.urls = urls
    33         self.urls = urls
    30 
    34 
    31     def respond (self, request) :
    35     def respond (self, request) :
    32         """
    36         """
    33             Lookup Request -> web.Handler, params
    37             Lookup Request -> web.Handler, params
   119         """
   123         """
   120             Render page layout (as <html>).
   124             Render page layout (as <html>).
   121         """
   125         """
   122 
   126 
   123         title = self.title()
   127         title = self.title()
   124 
   128         head = html(
   125         return html.html(
       
   126             html.head(
       
   127                 html.title(title),
       
   128                 (
   129                 (
   129                     html.link(rel='Stylesheet', type="text/css", href=src) for src in self.CSS
   130                     html.link(rel='Stylesheet', type="text/css", href=src) for src in self.CSS
   130                 ), 
   131                 ), 
   131                 (
   132                 (
   132                     html.script(src=src, type='text/javascript', _selfclosing=False) for src in self.JS
   133                     html.script(src=src, type='text/javascript', _selfclosing=False) for src in self.JS
   133                 ),
   134                 ),
   134             ),
   135         )
   135             html.body(
   136         body = html(self.render())
   136                 html.h1(title),
   137 
   137                 self.render() 
   138         if self.app.layout :
       
   139             return self.app.layout.format(
       
   140                 TITLE   = unicode(title),
       
   141                 HEAD    = unicode(head),
       
   142                 BODY    = unicode(body),
   138             )
   143             )
   139         )
   144         else :
       
   145             return html.document(html.html(
       
   146                 html.head(
       
   147                     html.title(title),
       
   148                     head,
       
   149                 ),
       
   150                 html.body(
       
   151                     html.h1(title),
       
   152                     body,
       
   153                 )
       
   154             ))
   140 
   155 
   141     def process (self, **params) :
   156     def process (self, **params) :
   142         """
   157         """
   143             Process request args to build internal request state.
   158             Process request args to build internal request state.
   144         """
   159         """
   157 
   172 
   158         if response :
   173         if response :
   159             return response
   174             return response
   160         
   175         
   161         # render as html per default
   176         # render as html per default
   162         render = self.render_html()
   177         text = unicode(self.render_html())
   163         text = unicode(html.document(render))
       
   164 
   178 
   165         return Response(text, mimetype='text/html')
   179         return Response(text, mimetype='text/html')
   166     
   180     
   167     def cleanup (self) :
   181     def cleanup (self) :
   168         """
   182         """