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

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的强制序列化校验。
  • 修复方法:
    1. 将路由中的@bp.response(200, JwtTokenResponse)改为@bp.response(200, JwtTokenResponse()),传入Schema实例。
    2. 建议同步修改@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:55:22