qmsk/web/async.py
author Tero Marttila <terom@paivola.fi>
Thu, 29 Jan 2015 22:16:16 +0200
changeset 106 89bd5028b150
child 107 05707929ff6f
permissions -rw-r--r--
qmsk.web.async
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
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
class Handler (qmsk.web.application.Handler) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
    def process_async (self, **params) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
        """
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
            Process request asynchronously.
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
            May optionally return a Response, to e.g. redirect after POST.
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
        """
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
        pass
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    def respond_async (self, **params):
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        response = yield from self.process_async(**params)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        if response :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
            return response
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        return self.respond(**params)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
class Application (qmsk.web.application.Application) :
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    @asyncio.coroutine
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    def __call__ (self, environ, start_response):
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        request = werkzeug.Request(environ)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        handler, params = self.lookup(request)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        try:
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            handler.init()
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            response = yield from handler.respond_async(**params)
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        finally:
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            handler.cleanup()
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
89bd5028b150 qmsk.web.async
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        return response(environ, start_response)