为什么在Flask中发送json数据时出现400个错误请求?

为什么在Flask中发送json数据时出现400个错误请求?,flask,flask-restful,Flask,Flask Restful,我正在尝试编写一个小型restful api应用程序,我正在使用Chrome Postman扩展向应用程序发送请求 我相信我的代码没有错误,但每次我发送post请求400错误请求时,我的代码如下: @api_route.route('/api', methods=['GET']) def api(): return jsonify({'message':'Api v1.0'}) @api_route.route('/api', methods=['POST']) def create_

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

我相信我的代码没有错误,但每次我发送post请求400错误请求时,我的代码如下:

@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数据如下所示:

@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!'})
{“email”:“Test”,“password”:“123123”}

为什么会出现400错误

更新

使用邮递员的请求截图:

获取请求

发布请求

在这里,我在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()

一个好的方法是按照以下方式构建您的观点:

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

@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

我解决了这个问题,我已经用app启动了
CSRFProtect
,因此我需要在所有请求中包含
X-CSRFToken
,因此我有两个选择:

1-将csrf_令牌包含在所有请求的
request.headers

2-使用
@csrf.employ
flask\u wtf.csrf附带的装饰器

现在我使用的是
@csrf.emption
,所以它变成这样:

@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对他的兴趣,敬礼:)。

对于其他在邮递员和Flask中遇到这种情况的人,请注意-如果邮递员中的URL是HTTPS,但Flask应用程序只处理HTTP,您也会遇到HTTP 404。

到您的请求的路径是什么?@MrPyCharm,您能替换
返回jsonify({'message',New User Created!'})
使用
return jsonify({'message':'New User Created!'})
并尝试一下?我尝试了,同样的错误也出现了,即使我只是尝试打印数据并删除了return函数!!400意味着你的请求有问题。在
localhost:5000/api
上的
GET
请求是否有效?首先感谢您的关注,伙计,但是没有任何改变仍然出现错误,我真的很困惑为什么这样做不起作用???,几个月前我输入了另一个小api todo列表,代码看起来除了路由名称之外没有任何改变!嗯,上面的代码片段在我的系统上运行良好。您还可以检查正在进行的
Api
调用,这可能是导致问题的Api对象导致问题的原因,因此它应该返回错误,例如在将数据插入数据库时发生了什么,但是如果我发送POST请求,错误会立即显示!!数据是否被插入数据库?是否有一些烧瓶扩展导致了此类问题,或者可能是配置,在我的应用程序中,我有另外4个蓝图路线注册到blueprint,包括
api\u路线
!!!