问题描述
自己的项目加refresh token时需要设置为cookie,看了其他博客写的设置cookie,一般用以下方法设置:
@auth_router.get("/set-refresh-token2")
async def get_refresh_token(response: Response):
response.set_cookie(
key="refreshToken",
value="eyJhbGciOiJIUzI1NiIsInR5c"
)
return {"value": "eyJhbGciOiJIUzI1NiIsInR5c"}
即使用Response对象的set_cookie方法,并且返回字典(fastapi自动转成JSON响应)。
但我在项目代码直接设置是不能设置cookie的,使用别的博客的demo又能成功设置,花了一晚上终于发现是返回了自定义响应类的问题,这个时候还用原始的Response设置cookie肯定是没用的。
问题复现
自定义响应类:
class Success(JSONResponse, Generic[T]):
def __init__(
self,
code: int = 200,
msg: Optional[str] = "OK",
data: Optional[T] = None,
**kwargs,
):
# 使用 Pydantic 模型验证和构建响应内容
response_model = SuccessResponse[T](
msg=msg,
data=data,
**kwargs
)
super().__init__(
content=response_model.model_dump(),
status_code=code
)
设置cookie的测试代码:
cookie="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMDY4ZmE3YTItZjQxZi03MTRiLTgwMDAtYmRlMDA4ZTNiMzI0IiwianRpIjoiMDY5MDUyMWItOWY5MS03NWFiLTgwMDAtNTNiNjA4ZTI2ZDM0IiwiZXhwIjoxNzY0NTM1OTkzLCJpYXQiOjE3NjE5NDM5OTN9.9eJrAXR93ZIh8Cu9WQWaKwzcXwmrYhUeHEu3ZG69X3g"
@auth_router.get("/set-refresh-token")
async def get_refresh_token(response: Response):
response.set_cookie(
key="refreshToken",
value=cookie
)
return Success(msg="eyJhbGciOiJIUzI1NiIsInR5c")
用postman测试,可以看到响应没有设置cookie:

解决方法
只需要先创建自定义响应类对象,再调用set_cookie方法:
cookie="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMDY4ZmE3YTItZjQxZi03MTRiLTgwMDAtYmRlMDA4ZTNiMzI0IiwianRpIjoiMDY5MDUyMWItOWY5MS03NWFiLTgwMDAtNTNiNjA4ZTI2ZDM0IiwiZXhwIjoxNzY0NTM1OTkzLCJpYXQiOjE3NjE5NDM5OTN9.9eJrAXR93ZIh8Cu9WQWaKwzcXwmrYhUeHEu3ZG69X3g"
@auth_router.get("/set-refresh-token")
async def get_refresh_token():
response = Success(msg="eyJhbGciOiJIUzI1NiIsInR5c")
response.set_cookie(
key="refreshToken",
value=cookie
)
return response
测试结果:

成功设置cookie:

补充说明
不能直接在返回自定义响应类后面调用set_cookie方法,否则会无法返回自定义响应,相当于return None(因为set_cookie方法返回None)
示例:
@auth_router.get("/set-refresh-token3")
async def get_refresh_token(response: Response):
response.set_cookie(
key="refreshToken",
value="cookie1"
)
return Success(msg="cookie2").set_cookie(
key="refreshToken",
value="cookie2"
)
返回的确实是None:

因为返回None,所以Response类设置的cookie生效了:

678

被折叠的 条评论
为什么被折叠?



