FastAPI中间件中如何更新Request的session?
FastAPI中间件中如何更新Request的session?
嘿,我懂你碰到的问题了!你现在的代码是先调用call_next(request)处理完请求,再去修改request.session,这其实踩了个常见的坑——FastAPI的session处理逻辑是在请求被路由处理的阶段完成的,等你执行完await call_next(request),后续视图函数已经用原来的session处理完请求了,这时候再改session,不仅不会影响这次请求,修改的内容也不会被框架保存下来。
咱们调整下操作顺序就好:先修改session,再调用call_next,这样后续的路由代码能拿到更新后的session,而且修改的内容也会被正确持久化。
把你的代码改成这样试试:
@app.middleware("http") async def renewal_token(request: Request, call_next): now = datetime.now() expire = now + timedelta(minutes=30) session_id = request.session["session_id"] # 先更新session,再让后续流程处理请求 request.session["token_expiry"] = expire.timestamp() response = await call_next(request) response.set_cookie(key="Authorization", value=session_id, expires=expire.replace(tzinfo=timezone.utc)) return response
你之前试的request.session.clear()后再赋值没用,也是同样的原因——操作时机太晚了,session已经在call_next的流程里被处理完毕,后续的修改根本不会生效。
核心要点就是:在中间件里修改request.session,一定要把修改操作放在await call_next(request)之前,这样才能让后续请求环节感知到session的变化,同时保证修改被框架正确保存。
备注:内容来源于stack exchange,提问作者Mohammad Pourbehzad
相关产品推荐
相关产品推荐

