为什么我在Flask中发送json数据时收到400 Bad Request错误?

时间:2017-09-11 10:31:25

标签: flask flask-restful

我正在尝试编写一个小的restful api应用程序,我正在使用Chrome Postman扩展名向应用程序发送请求。

我相信我的代码没有错误,但每次我发送帖子请求 400 Bad Request 错误引发时,这是我的代码:

@api_route.route('/api', methods=['GET'])
def api():
    return jsonify({'message':'Api v1.0'})

@api_route.route('/api', methods=['POST'])
def create_user():
    data = request.get_json()
    if data:
        hashed_password = generate_password_hash(data['password'], method='sha256')
        api = Api(email=data['email'], password=hashed_password)
        db.session.add(api)
        db.session.commit()
        return jsonify({'message', 'New User Created!'})

我发送的json数据如下所示:

{"email" : "Test", "password" : "123123123"}

为什么我收到 400错误 ??

更新

使用Postman的请求的屏幕截图:

获取请求 GET Request

POST请求 POST Request

这里我在api控制器内启动api路由:

from flask import Blueprint
api_route = Blueprint(
    'api',
    __name__
)
from . import views

然后我在def create_app()函数中注册它:

from .api import api_route
app.register_blueprint(api_route)

以下是我在我的应用程序中使用的扩展程序:

toolbar = DebugToolbarExtension()
assets_env = Environment()
cache = Cache()
moment = Moment()
htmlminify = HTMLMIN()
csrf = CSRFProtect()
jac = JAC()
googlemap = GoogleMaps()
session = Session()
principal = Principal()

3 个答案:

答案 0 :(得分:2)

我解决了这个问题,我已经通过app发起CSRFProtect所以我需要在所有请求中加入X-CSRFToken,所以我有两个选择:

1 - 在request.headers中包含所有请求的csrf_token

2 - 使用@csrf.exempt

附带的flask_wtf.csrf装饰器

现在我正在使用@csrf.exempt,所以它变成了这样:

@api_route.route('/api', methods=['GET','POST'])
@csrf.exempt
def create_user():
    if request.method == 'GET':
        return jsonify({'message' : 'API v1.0'})
    elif request.method == 'POST':
        data = request.get_json()
        hashed_password = generate_password_hash(data['password'], method='sha256')
        new_user_api = Api(email=data['email'], password=hashed_password)
        db.session.add(new_user_api)
        db.session.commit()
        return jsonify({'message' : 'New user created!'})
    return return jsonify({'message' : 'No user has been added!'})

感谢@MrPyCharm的兴趣,致敬:)。

答案 1 :(得分:1)

一个好的方法是按如下方式构建您的视图:

您可以在同一视图中处理请求方法,而不是为不同的请求方法创建具有相同路由的视图:

@api_route.route('/api', methods=['GET', 'POST'])
def api():
    if request.method == 'GET':
        return jsonify({'message':'Api v1.0'})

    else:
        data = request.get_json(force=True)
        if data:
            hashed_password = generate_password_hash(data['password'], method='sha256')
            api = Api(email=data['email'], password=hashed_password)
            db.session.add(api)
            db.session.commit()
            return jsonify({'message': 'New User Created!'})

        # Just in case the if condition didn't satisfy
        return None

答案 2 :(得分:0)

对于使用PostMan和Flask进行此操作的其他人的注释-如果您在PostMan中的URL是HTTPS,但是Flask应用仅处理HTTP,则您还将命中HTTP 404。