为什么在 Flask 中发送 json 数据时出现 400 Bad Request 错误?
Why i am getting 400 Bad Request error when sending json data in Flask?
我正在尝试编写一个小型 restful api 应用程序,我正在使用 Chrome Postman
扩展程序向应用程序发送请求。
我相信我的代码没有错误,但每次我发送 post 请求时都会引发 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 请求
POST 请求
这里我在 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
我解决了这个问题,我已经启动了 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 的关注,敬礼 :)。
给其他使用 PostMan 和 Flask 遇到此问题的人的注意事项 - 如果您在 PostMan 中的 URL 是 HTTPS 但您的 Flask 应用仅处理 HTTP,您也会遇到 HTTP 404。
我正在尝试编写一个小型 restful api 应用程序,我正在使用 Chrome Postman
扩展程序向应用程序发送请求。
我相信我的代码没有错误,但每次我发送 post 请求时都会引发 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 请求
POST 请求
这里我在 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
我解决了这个问题,我已经启动了 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 的关注,敬礼 :)。
给其他使用 PostMan 和 Flask 遇到此问题的人的注意事项 - 如果您在 PostMan 中的 URL 是 HTTPS 但您的 Flask 应用仅处理 HTTP,您也会遇到 HTTP 404。