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"})