Flask-smorest接口返回空JSON串,日志却显示数据正确
问题
使用Flask-Smorest开发的登录接口,输入正确凭证时返回空JSON{},但Flask日志里能看到包含access_token和refresh_token的完整响应字典;用户不存在或密码错误时,ErrorResponse却能正常返回对应错误信息。
路由代码
from flask_smorest import Blueprint bp = Blueprint("auth", __name__, url_prefix="/api/v1/auth/") @bp.route("/login", methods=["POST"]) @bp.arguments(LoginRequest) @bp.response(200, JwtTokenResponse) @bp.response(404, ErrorResponse) def login(args): current_app.logger.debug(args) username = args.get("username", None) password = args.get("password", None) current_app.logger.debug(f"Username: {username}") current_app.logger.debug(f"Password: {password}") user = User.query.filter_by(username=username).first() if user is None: return dict(message="User does not exists"), 404 if not check_password_hash(user.password, password): return dict(message="Unable to Authenticate user."), 404 access_token = create_access_token(identity=username) refresh_token = create_refresh_token(identity=username) response = dict(access_token=access_token, refresh_token=refresh_token) current_app.logger.debug(f"Response: {response}") return response, 200
Schema定义
from marshmallow import Schema, fields class JwtTokenResponse(Schema): access_token = fields.String() refresh_token = fields.String() class ErrorResponse(Schema): message = fields.String()
原因及解决方法
- 问题根源:Flask-Smorest的
@bp.response()装饰器要求传入Schema的实例,而非Schema类本身。你给200响应传入的JwtTokenResponse是类,导致框架无法正确序列化响应数据,最终返回空JSON。错误场景能正常返回是因为直接返回了字典,没有经过Schema的强制序列化校验。 - 修复方法:
- 将路由中的
@bp.response(200, JwtTokenResponse)改为@bp.response(200, JwtTokenResponse()),传入Schema实例。 - 建议同步修改
@bp.response(404, ErrorResponse)为@bp.response(404, ErrorResponse()),保持代码规范,避免后续出现同类问题。
- 将路由中的
修改后的路由装饰器示例:
@bp.route("/login", methods=["POST"]) @bp.arguments(LoginRequest) @bp.response(200, JwtTokenResponse()) @bp.response(404, ErrorResponse()) def login(args): # 原函数逻辑不变
内容的提问来源于stack exchange,提问作者spitfiredd
相关产品推荐
相关产品推荐

