【已解决】FastAPI解决自定义响应类无法设置cookie的问题

问题描述

        自己的项目加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生效了:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值