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)