将参数传递给基于 aiohttp class 的视图
Pass arguments to aiohttp class based view
有什么简单的方法可以使用 aiohttp 将自定义参数传递给 View 实例吗?
这个有效:
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,您可以在实例化 Web 应用程序时将附加数据作为 dict 对象传递。
回答我自己的问题:
事实证明,您可以在 Application
实例中存储类全局变量,然后在请求处理程序中访问它。它在文档中有描述:https://docs.aiohttp.org/en/latest/web_advanced.html#application-s-config
有什么简单的方法可以使用 aiohttp 将自定义参数传递给 View 实例吗?
这个有效:
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,您可以在实例化 Web 应用程序时将附加数据作为 dict 对象传递。
回答我自己的问题:
事实证明,您可以在 Application
实例中存储类全局变量,然后在请求处理程序中访问它。它在文档中有描述:https://docs.aiohttp.org/en/latest/web_advanced.html#application-s-config