svv/wsgi.py
author Tero Marttila <terom@fixme.fi>
Tue, 11 Jan 2011 01:12:50 +0200
changeset 57 7a48e9d96ec8
parent 32 10c48a6843ad
permissions -rw-r--r--
items: fix NewOrderView
3
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     1
# coding: utf-8
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     2
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     3
"""
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     4
    WSGI frontend/entry point
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     5
"""
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     6
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
import werkzeug
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
from werkzeug import exceptions
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
from werkzeug import Request, Response
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    11
import logging            
3
44122295656a Fully fledged PDF output
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    12
import datetime
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    14
from svv import pdf
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    15
from svv import database as db
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    16
from svv.urls import URLS
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    17
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
# logging
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
log = logging.getLogger('svv.wsgi')
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
class WSGIApp (object) :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        Top-level WSGI handler impl
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    26
    def __init__ (self, app) :
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    27
        """
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    28
            app     - the top-level Application state used by handlers
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    29
        """
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    30
        
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    31
        self.app = app
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    # wrap to use werkzeug's Request/Response
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    @Request.application
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    def __call__ (self, req) :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            Main WSGI entry point, error handling
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        try :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
            # wrapped handler
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            response = self.request(req)
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        except exceptions.HTTPException, e :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            # format properly as response, also includes redirects
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            return e.get_response(req.environ)
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        # XXX: except Exception, e :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        # XXX: we want to trap errors in prod, but not in dev?
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        else :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
            # a-ok
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            return response
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    def request (self, req) :
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            Wrapped request handler, URL mapping
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        """
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        # map URLs against this request
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    61
        urls = URLS.bind_to_environ(req)
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        # lookup matching URL for handler type and matched values from URL
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        url_handler, url_values = urls.match()
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        # the per-request handler (from endpoint)
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    67
        req_handler = url_handler(self.app, req, urls)
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        # XXX: per-method thing?
32
10c48a6843ad Optionally take contract text from form input
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    70
        response = req_handler.respond(**url_values)
0
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        # ok
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        return response
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
b28a1681e79b Initial layout, with hello-world
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75