You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用flask-restx设置JWT Cookie遇序列化错误,求解决方案

Flask-RESTX结合Flask-JWT-Extended设置JWT Cookie的解决方案

你的问题核心是Flask-RESTX的Resource方法默认会尝试对返回值的第一个元素做JSON序列化,直接返回Flask Response对象会触发序列化错误。下面是两种可行的修正方案:

方案一:构造带数据的响应并设置Cookie

直接使用make_response创建包含响应数据和状态码的Response对象,再设置JWT Cookie后返回:

from flask import make_response, jsonify
from flask_jwt_extended import create_access_token, set_access_cookies

@namespace.route("/login")
class Login(Resource):
    @namespace.expect(login_model)
    def post(self):
        data = namespace.payload
        username = data.get("username")
        password = data.get("password")

        user = User.query.filter_by(username=username).first()
        if not user or not check_password_hash(user.password, password):
            return {"message": "Unauthorized"}, 401

        access_token = create_access_token(identity=user, fresh=True)
        
        # 构造响应内容
        response_data = {"message": "登录成功"}
        # 创建响应对象并指定状态码
        response = make_response(jsonify(response_data), 200)
        # 设置JWT Cookie
        set_access_cookies(response, access_token)
        # 直接返回Response对象
        return response

方案二:返回空响应仅设置Cookie

如果不需要返回额外JSON数据,可创建空响应对象:

from flask import make_response
from flask_jwt_extended import create_access_token, set_access_cookies

@namespace.route("/login")
class Login(Resource):
    @namespace.expect(login_model)
    def post(self):
        data = namespace.payload
        username = data.get("username")
        password = data.get("password")

        user = User.query.filter_by(username=username).first()
        if not user or not check_password_hash(user.password, password):
            return {"message": "Unauthorized"}, 401

        access_token = create_access_token(identity=user, fresh=True)
        
        # 创建空响应并指定状态码
        response = make_response("", 200)
        # 设置JWT Cookie
        set_access_cookies(response, access_token)
        return response

错误原因说明

你之前的代码中,return response, 200的写法会让Flask-RESTX尝试将response(Response对象)序列化为JSON,而Response对象本身不支持JSON序列化,因此触发TypeError。正确的做法是直接返回已包含状态码的Response对象,无需额外传递状态码参数。

内容的提问来源于stack exchange,提问作者VANN Universal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:42:47