使用flask-restx设置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
相关产品推荐
相关产品推荐

