qmsk/web/async.py
author Tero Marttila <terom@paivola.fi>
Thu, 29 Jan 2015 23:11:44 +0200
changeset 107 05707929ff6f
parent 106 89bd5028b150
permissions -rw-r--r--
qmsk.web.async: handle HTTPExceptions
import asyncio
import qmsk.web.application
import werkzeug
import werkzeug.exceptions

class Handler (qmsk.web.application.Handler) :
    @asyncio.coroutine
    def process_async (self, **params) :
        """
            Process request asynchronously.

            May optionally return a Response, to e.g. redirect after POST.
        """

        pass

    @asyncio.coroutine
    def respond_async (self, **params):
        response = yield from self.process_async(**params)

        if response :
            return response

        return self.respond(**params)

class Application (qmsk.web.application.Application) :
    @asyncio.coroutine
    def __call__ (self, environ, start_response):
        request = werkzeug.Request(environ)
        
        handler = None

        try:
            handler, params = self.lookup(request)

            handler.init()

            response = yield from handler.respond_async(**params)
        
        except werkzeug.exceptions.HTTPException as error :
            response = error

        finally:
            if handler:
                handler.cleanup()

        return response(environ, start_response)