qmsk/web/async.py
author Tero Marttila <terom@paivola.fi>
Sat, 31 Jan 2015 18:49:51 +0200
changeset 114 0f5e58ffe624
parent 107 05707929ff6f
permissions -rw-r--r--
qmsk.web.rewrite
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
import asyncio
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
import qmsk.web.application
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import werkzeug
107
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
     4
import werkzeug.exceptions
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
class Handler (qmsk.web.application.Handler) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    def process_async (self, **params) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
        """
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
            Process request asynchronously.
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
            May optionally return a Response, to e.g. redirect after POST.
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
        """
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
        pass
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    def respond_async (self, **params):
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
        response = yield from self.process_async(**params)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        if response :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
            return response
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
        return self.respond(**params)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
class Application (qmsk.web.application.Application) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    def __call__ (self, environ, start_response):
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        request = werkzeug.Request(environ)
107
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    30
        
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    31
        handler = None
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        try:
107
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    34
            handler, params = self.lookup(request)
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    35
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            handler.init()
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            response = yield from handler.respond_async(**params)
107
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    39
        
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    40
        except werkzeug.exceptions.HTTPException as error :
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    41
            response = error
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        finally:
107
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    44
            if handler:
05707929ff6f qmsk.web.async: handle HTTPExceptions
Tero Marttila <terom@paivola.fi>
parents: 106
diff changeset
    45
                handler.cleanup()
106
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        return response(environ, start_response)