如何检查 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)):
我定义了一个可选的 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)):