Каков правильный подход к использованию обработчиков на основе классов вместо функций в aiohttp? Я привык писать обработчики как классы в Django, так что мне интересно, как это сделать правильно в aiohttp?Виды на основе классов в aiohttp
6
A
ответ
5
Я предполагаю, что вы хотите использовать обработчики на основе классов для применения наследования для повторного использования кода.
Технически веб-обработчик aiohttp представляет собой любую сопрограмму, которая принимает параметр запроса и возвращает экземпляр ответа.
Например
class BaseView:
def __init__(self, ...):
...
@asyncio.coroutine
def __call__(self, request):
return web.Response()
app.router.add_route('GET', '/', BaseView(...))
могут быть использованы в качестве базового класса для создания веб-обработчиков иерархии.
Или даже
class Handler:
def __init__(self, db):
self._db = db
@asyncio.coroutine
def get_from_db(self, data):
...
@asyncio.coroutine
def handle_a(self, request):
data = yield from self.get_from_db(
self.extract_from_request_a(request))
return web.Response(self.format_data(data))
@asyncio.coroutine
def handle_b(self, request):
data = yield from self.get_from_db(
self.extract_from_request_b(request))
return web.Response(self.format_data(data))
handler = Handler(db)
app.router.add_route('GET', '/a', hadndler.handle_a)
app.router.add_route('GET', '/b', hadndler.handle_b)
До сих пор не поняли, как добавить функцию пост (запрос), например. Должен ли я реализовать метод as_view() для использования в URL-адресах – vwvolodya
Я добавил пример для регистрации экземпляра. Код не воссоздает BaseView для каждого запроса - я нашел, что не требуется, как правило, мы очень хорошо используем подход с классом «Handle». –
Обновление: добавлена новая версия [Class Based Views] (https://aiohttp.readthedocs.org/en/stable/web.html#class-based-views). Обратите внимание, что есть сложности с этим, не все «aio-libs» поддерживают его полностью – nerdwaller