【发布时间】:2019-06-06 20:42:04
【问题描述】:
我正在设置一个aiohttp 服务器,使用aiohttp_session 将数据存储到EncryptedCookieStorage。我用它来存储一个 7 天有效的令牌,以及到期日期和一个刷新令牌。
无论客户端访问哪个端点,我都希望检查令牌(存储在会话中)是否需要一些更新。中间件的选择非常明显。
问题是,当我打电话给await aiohttp_session.get_session(request) 时,我收到了一个很好的RuntimeError,要求我将aiohttp_session 中间件设置为aiohttp.web.Application。我的猜测是,我的自定义中间件在处理会话加载之前被称为 ,因此该会话尚不可访问。我搜索了一些关于中间件的“优先”系统,但没有找到任何东西。
我的服务器设置在 main.py 文件中,例如:
def main():
app = web.Application()
middleware.setup(app)
session_key = base64.urlsafe_b64decode(fernet.Fernet.generate_key())
aiohttp_session.setup(app, EncryptedCookieStorage(session_key))
# I have tried swapping the two setup functions
web.run_app(app)
if __name__ == '__main__':
main()
middleware.setup() 位于单独的包中,在 __init__.py 中:
# For each python file in the package, add it's middleware function to the app middlewares
def setup(app):
for filename in listdir('middleware'):
if filename[-2:] == 'py' and filename[:2] != '__':
module = __import__('rpdashboard.middleware.' + filename[:-3], fromlist=['middleware'])
app.middlewares.append(module.middleware)
最后,我想要获取会话的中间件是:
@web.middleware
async def refresh_token_middleware(request, handler):
session = await get_session(request)
if session.get('token'):
pass # To be implemented ...
return await handler(request)
middleware = refresh_token_middleware
这里的执行问题:
# From aiohttp_session
async def get_session(request):
session = request.get(SESSION_KEY)
if session is None:
storage = request.get(STORAGE_KEY)
if storage is None:
# This is raised
raise RuntimeError(
"Install aiohttp_session middleware "
"in your aiohttp.web.Application")
正如我之前所说,似乎会话不打算在中间件中访问,并且尚未加载。那么如何防止我的自定义中间件在会话加载之前运行呢?或者也许只是自己手动运行aiohttp_session 中间件?有没有可能?
【问题讨论】:
-
您是否尝试在中间件之前设置会话?
标签: python middleware aiohttp