Flask 测试客户端使用方法获取错误的视图函数
Flask testing client picking up wrong view function with method
我在蓝图中有一些视图函数。它们如下所示:
@app.route('/panel/<int:id>', methods=['GET'])
def get_panel(id):
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
@app.route('/panel/<int:id>', methods=['POST'])
def post_panel(id):
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})
当我尝试测试视图函数 post_panel() 时,它以某种方式获取了 get_panel()。由于两个函数 url 相同,我认为这就是导致问题的原因。
有什么办法吗?
这不是处理同一 API 端点的不同请求类型的正确方法。试试下面的方法
from flask import request
@app.route('/panel/<int:id>', methods=['GET', 'POST'])
def get_panel(id):
if request.method == 'GET':
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
elif request.method == 'POST':
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})
不可能声明两个函数来分别处理 GET 和 POST。
你必须使用一个功能,
并有条件地决定做什么,
如 docs:
中的示例所示
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
所以你可以这样写:
@app.route('/panel/<int:id>', methods=['GET', 'POST'])
def handle_panel(id):
if request.method == 'POST':
return post_panel(id)
else:
return get_panel(id)
def get_panel(id):
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
def post_panel(id):
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})
我在蓝图中有一些视图函数。它们如下所示:
@app.route('/panel/<int:id>', methods=['GET'])
def get_panel(id):
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
@app.route('/panel/<int:id>', methods=['POST'])
def post_panel(id):
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})
当我尝试测试视图函数 post_panel() 时,它以某种方式获取了 get_panel()。由于两个函数 url 相同,我认为这就是导致问题的原因。
有什么办法吗?
这不是处理同一 API 端点的不同请求类型的正确方法。试试下面的方法
from flask import request
@app.route('/panel/<int:id>', methods=['GET', 'POST'])
def get_panel(id):
if request.method == 'GET':
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
elif request.method == 'POST':
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})
不可能声明两个函数来分别处理 GET 和 POST。 你必须使用一个功能, 并有条件地决定做什么, 如 docs:
中的示例所示@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
所以你可以这样写:
@app.route('/panel/<int:id>', methods=['GET', 'POST'])
def handle_panel(id):
if request.method == 'POST':
return post_panel(id)
else:
return get_panel(id)
def get_panel(id):
panel = Panel.query.filter_by(id=id).first()
return jsonify(panel.getJson())
def post_panel(id):
panel = request.get_json().get('panel')
# code for saving the data in database
return jsonify({"message": "Saved in database"})