terom@3: # coding: utf-8 terom@3: terom@3: """ terom@3: WSGI frontend/entry point terom@3: """ terom@3: terom@0: import werkzeug terom@0: from werkzeug import exceptions terom@0: from werkzeug import Request, Response terom@0: terom@6: import logging terom@3: import datetime terom@0: terom@6: from svv import pdf terom@6: from svv import database as db terom@6: from svv.urls import URLS terom@6: terom@0: # logging terom@0: log = logging.getLogger('svv.wsgi') terom@0: terom@0: class WSGIApp (object) : terom@0: """ terom@0: Top-level WSGI handler impl terom@0: """ terom@0: terom@6: def __init__ (self, app) : terom@6: """ terom@6: app - the top-level Application state used by handlers terom@6: """ terom@6: terom@6: self.app = app terom@0: terom@0: # wrap to use werkzeug's Request/Response terom@0: @Request.application terom@0: def __call__ (self, req) : terom@0: """ terom@0: Main WSGI entry point, error handling terom@0: """ terom@0: terom@0: try : terom@0: # wrapped handler terom@0: response = self.request(req) terom@0: terom@0: except exceptions.HTTPException, e : terom@0: # format properly as response, also includes redirects terom@0: return e.get_response(req.environ) terom@0: terom@0: # XXX: except Exception, e : terom@0: # XXX: we want to trap errors in prod, but not in dev? terom@0: terom@0: else : terom@0: # a-ok terom@0: return response terom@0: terom@0: def request (self, req) : terom@0: """ terom@0: Wrapped request handler, URL mapping terom@0: """ terom@0: terom@0: # map URLs against this request terom@6: urls = URLS.bind_to_environ(req) terom@0: terom@0: # lookup matching URL for handler type and matched values from URL terom@0: url_handler, url_values = urls.match() terom@0: terom@0: # the per-request handler (from endpoint) terom@6: req_handler = url_handler(self.app, req, urls) terom@0: terom@0: # XXX: per-method thing? terom@0: response = req_handler.respond(url_values) terom@0: terom@0: # ok terom@0: return response terom@0: terom@0: