Передать аргументы в представление на основе классов aiohttp - PullRequest
0 голосов
/ 03 февраля 2020

Есть ли простой способ передачи пользовательских аргументов в экземпляры View с помощью aiohttp?

Это работает:

import aiohttp.web
import functools

class Parent():
    def __init__(self, val):
        self.var = val

class BaseView(aiohttp.web.View):
    def __init__(self, *args, **kwargs):
        self.parent = kwargs.pop("parent")
        super().__init__(*args, **kwargs)

class Handler(BaseView):
    async def get(self):
        return aiohttp.web.Response(text=self.parent.var)

def partial_class(cls, *args, **kwargs):
    class NewCls(cls):
        __init__ = functools.partialmethod(cls.__init__, *args, **kwargs)
    return NewCls

def main():
    parent = Parent("blablabla")
    app = aiohttp.web.Application()
    # New method with args
    app.router.add_view_with_args = functools.partial(
        lambda this, path, handler, d: this.add_view(path, partial_class(handler, **d)),
        app.router,
    )
    # Tornado-style
    app.router.add_view_with_args("/test", Handler, {"parent": parent})
    aiohttp.web.run_app(app)

main()

Но я чувствую, что это слишком сложно. С помощью Tornado вы можете передавать дополнительные данные как объект dict при создании экземпляра своего веб-приложения.

1 Ответ

0 голосов
/ 04 февраля 2020

Отвечая на мой собственный вопрос:

Оказывается, вам разрешено хранить глобальные переменные в экземпляре Application и затем обращаться к нему в обработчике запросов. Это описано в документации: https://docs.aiohttp.org/en/latest/web_advanced.html#application -s-config

...