FastAPI中的SessionMiddleware为每个请求创建新会话

bd1hkmkf  于 2022-10-02  发布在  Python
关注(0)|答案(1)|浏览(978)

我有这个密码。我需要在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)

eivnm1vs

eivnm1vs1#

您可以在每次新请求到达时使用Middleware覆盖Response cookies中的session值(也请查看Starlette中的文档);因此,session将保持不变。

注意:记住在SessionMiddleware添加到app示例之后声明您的自定义中间件,因为在您的应用程序中定义端点/子应用程序的顺序很重要,如here所述(请参阅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

相关问题