gpt4 book ai didi

python - aiohttp:装饰器序列链

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:03 25 4
gpt4 key购买 nike

考虑以下代码:

from aiohttp_mako import template

def authorize():
def wrapper(func):
@asyncio.coroutine
@functools.wraps(func)
def wrapped(*args):
allowed = # Some auth stuff
if not allowed:
return HTTPUnauthorized()
return func()
return wrapped
return wrapper


@authorize()
@template('admin.mak')
async def admin(request):
return dict(ok=True)

我希望 authorize() ' wrapper得到template装饰器作为其 func这样我就可以返回 Response它在我的 authorize 中生成装饰器。但是authorize() ' wrapper需要 admin()协程作为 func最后是

File "/Users/etemin/virtualenvs/onlinelux/lib/python3.5/site-packages/aiohttp/web.py", line 306, in _handle
resp = yield from handler(request)
File "/Users/etemin/virtualenvs/onlinelux/lib/python3.5/site-packages/aiohttp_session/__init__.py", line 134, in middleware
raise RuntimeError("Expect response, not {!r}", type(response))
RuntimeError: ('Expect response, not {!r}', <class 'generator'>)

因为它试图返回协程。我应该如何返回 template装饰器?

最佳答案

您已经包装了一个协同例程,因此您需要等待该协同例程(从中产生):

def authorize():
def wrapper(func):
@asyncio.coroutine
@functools.wraps(func)
def wrapped(*args):
allowed = # Some auth stuff
if not allowed:
return HTTPUnauthorized()
return yield from func()
return wrapped
return wrapper

因为您已经在使用 async/await 语法,所以我在这里也只使用它而不使用 @asyncio.coroutine :

def authorize():
async def wrapper(func):
@functools.wraps(func)
async def wrapped(*args):
allowed = # Some auth stuff
if not allowed:
return HTTPUnauthorized()
return await func()
return wrapped
return wrapper

请注意,我在那里等待 func(),并返回了结果。

关于python - aiohttp:装饰器序列链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44848486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com