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

Flask Rest API视图返回无效响应,Postman测试报TypeError

错误原因分析

1. 返回语句格式错误(核心问题)

你的多个return语句存在语法错误,导致没有返回符合Flask要求的响应元组:

  • 部分返回语句在逗号后换行,Python会将其解析为两个独立语句,实际只返回了jsonify的结果,没有带上状态码,比如:
    return jsonify({'error': "Password is too short"}),
    HTTP_400_BAD_REQUEST 
    
    这里逗号后的换行让Python认为HTTP_400_BAD_REQUEST是单独的代码行,并非元组的一部分,所以返回的不是(响应体, 状态码)的合法元组。
  • 检查邮箱合法性的返回语句甚至缺少逗号,直接写成:
    return jsonify({'error': "Email is not valid"})
    HTTP_400_BAD_REQUEST
    
    这行代码只会返回jsonify的结果,下一行的状态码完全无效,同样不符合要求。

2. 测试路由不匹配

你在Postman中请求的是http://127.0.0.1:5000/api/v1/auth/test,但视图函数绑定的路由是/api/v1/auth/register,路由不匹配会导致请求找不到对应的处理函数,不过当前报错来自视图函数内部,说明你实际请求的应该是register路由,但需要确认请求地址是否正确。

修复方案

1. 修正返回语句格式

把所有需要返回响应体+状态码的语句改成以下两种正确格式:

  • 格式一:将元组用括号包裹,换行不受影响
    return (jsonify({'error': "Password is too short"}), HTTP_400_BAD_REQUEST)
    
  • 格式二:保持在同一行,不需要括号
    return jsonify({'error': "Password is too short"}), HTTP_400_BAD_REQUEST
    

修正后的完整视图函数代码:

auth = Blueprint("auth", __name__, url_prefix="/api/v1/auth")

@auth.post('/register')
def register():
    username = request.json['username']
    password = request.json['password']
    email = request.json['email']
    

    if len(password) < 6:
        return jsonify({'error': "Password is too short"}), HTTP_400_BAD_REQUEST 

    if len(username) < 3: 
        return jsonify({'error': "Username is too short"}), HTTP_400_BAD_REQUEST

    # 修正原逻辑矛盾:用户名必须是字母数字且不含空格
    if not username.isalnum() or " " in username: 
        return jsonify({'error': "Username should be alphanumeric and contain no spaces"}), HTTP_400_BAD_REQUEST 

    if not validators.email(email):
        return jsonify({'error': "Email is not valid"}), HTTP_400_BAD_REQUEST

    if User.query.filter_by(email=email).first() is not None: 
        return jsonify({'error': "Email is taken"}), HTTP_409_CONFLICT

    if User.query.filter_by(username=username).first() is not None: 
        return jsonify({'error': "Username is taken"}), HTTP_409_CONFLICT

        
    pwd_hash=generate_password_hash(password)

    user = User(username=username, password=pwd_hash, email=email)

    db.session.add(user)
    db.session.commit()

    return jsonify({
        'message': "User created", 
        'user': {
            'username': username, 'email': email
        }
    }), HTTP_201_CREATED

注:顺便修正了原代码中两处用户名判断的逻辑矛盾和错误提示文本,原判断逻辑会导致错误的校验结果

2. 修正测试路由

在Postman中请求正确的路由:http://127.0.0.1:5000/api/v1/auth/register,请求方法选择POST,并确保请求体是JSON格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:24