如何检查 FastAPI 中是否设置了 cookie?

How to check if a cookie is set in FastAPI?

我定义了一个可选的 cookie 参数,现在想检查是否设置了 cookie。不幸的是,该变量不等于 None 而是一个空的 Cookie 对象。如果设置了 cookie 对象,我该如何检查?
以下是我定义 cookie 参数的方式:

@app.route("/graphcall")
def graphcall(request: Request, ads_id: Optional[str] = Cookie(None)):
    if ads_id:
      # Do stuff if the ads_id is set

我假设您是通过 SwaggerUI 尝试过的。由于浏览器安全限制,目前无法通过 SwaggerUI 设置 Cookie 值。

@app.get("/items/")
async def read_items(ads_id: Optional[str] = Cookie(None)):
    if ads_id:
        answer = "set to %s" % ads_id
    else:
        answer = "not set"
    return {"ads_id": answer}

使用 Fastapi 0.61.0 从命令行完美运行

$ curl -X GET "http://127.0.0.1:8000/items/" -H  "accept: application/json" -H  "Cookie: ads_id=foobar"
{"ads_id":"set to foobar"}

$ curl -X GET "http://127.0.0.1:8000/items/" -H  "accept: application/json"
{"ads_id":"not set"}

对我来说这很有效

async def setcookie(request: Request, nm: str = Form(...)):
    print("setcookie "+nm)
    response = templates.TemplateResponse("readcookie.html",{"request": request})
    response.set_cookie(key="userID", value=nm)

@app.get("/getcookie/", response_class=HTMLResponse)
async def getcookie(request: Request,userID: Optional[str] = Cookie(None)):
    if userID:
        print("getcookie "+userID)
    else:
        print("getcookie None")
    return templates.TemplateResponse("showcookie.html", {"request": request, "name": userID})

在 getcookie 中,我在 setcookie 中设置了 cookie。

我遵循这种方法:

https://fastapi.tiangolo.com/advanced/response-cookies/#return-a-response-directly

我还是不明白为什么Optional[str] = Cookie(None)方法没有用。对我来说这种方式有效

@router.post('/login')
async def sign_in(
        user_data: OAuth2PasswordRequestForm = Depends(),
        service: AuthService = Depends(),
):
    session = await service.authenticate_user(
        user_data.username,
        user_data.password
    )
    response = RedirectResponse(url='/')
    response.set_cookie('Authorization', value=session['session_id'], httponly=True)
    return response


async def get_current_user(request: Request): 
    try:
        cookie_authorization: str = request.cookies.get("Authorization")
        # some logic with cookie_authorization
    except Exception as e:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN, detail="Invalid authentication"
        )

我觉得问题是你把

ads_id: Optional[str] = Cookie(None)

尝试

async defer(cookie_token: Optional[std] = Cookie(default=None)):