2015-09-28 5 views
6

Каков правильный подход к использованию обработчиков на основе классов вместо функций в aiohttp? Я привык писать обработчики как классы в Django, так что мне интересно, как это сделать правильно в aiohttp?Виды на основе классов в aiohttp

ответ

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) 
+2

До сих пор не поняли, как добавить функцию пост (запрос), например. Должен ли я реализовать метод as_view() для использования в URL-адресах – vwvolodya

+0

Я добавил пример для регистрации экземпляра. Код не воссоздает BaseView для каждого запроса - я нашел, что не требуется, как правило, мы очень хорошо используем подход с классом «Handle». –

+1

Обновление: добавлена ​​новая версия [Class Based Views] (https://aiohttp.readthedocs.org/en/stable/web.html#class-based-views). Обратите внимание, что есть сложности с этим, не все «aio-libs» поддерживают его полностью – nerdwaller

 Смежные вопросы

  • Нет связанных вопросов^_^