我需要在session_set
端点中创建一个用于身份验证的会话。但是,由于某种原因,会话仍在session_info
端点中创建。如何使仅在session_set
中创建的会话?否则,我将在每一次请求的响应中有一个新的会议。
这是我的代码:
import uvicorn
from fastapi import FastAPI, Request
from starlette.middleware.sessions import SessionMiddleware
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="some-random-string", max_age=None)
@app.get("/a")
async def session_set(request: Request):
request.session["my_var"] = "1234"
return 'ok'
@app.get("/b")
async def session_info(request: Request):
my_var = request.session.get("my_var", None)
return my_var
if __name__ == '__main__':
uvicorn.run('http-session:app', port=5000, reload=True)
发布于 2022-10-02 08:17:57
您可以在每次新请求到达时使用中间件覆盖曲奇饼中的session
值(也检查Starlette文件 );因此,session
将保持不变。
注意:记得在将SessionMiddleware
添加到app
实例之后声明您的自定义中间件,这是在应用程序matters中定义端点/子应用程序的顺序,如这个答案中所描述的那样(参见相关的FastAPI文档 )。
工作实例:
from fastapi import FastAPI, Request
from starlette.middleware.sessions import SessionMiddleware
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="some-random-string")
@app.middleware("http")
async def some_middleware(request: Request, call_next):
response = await call_next(request)
session = request.cookies.get('session')
if session:
response.set_cookie(key='session', value=request.cookies.get('session'), httponly=True)
return response
@app.get("/a")
def func_a(request: Request):
request.session["my_var"] = "1234"
print(request.cookies.get('session'))
return 'OK'
@app.get("/b")
def func_b(request: Request):
my_var = request.session.get("my_var", None)
print(request.cookies.get('session'))
return my_var
https://stackoverflow.com/questions/73897479
复制相似问题