【问题标题】:Flask testing client picking up wrong view function with method烧瓶测试客户端使用方法获取错误的视图功能
【发布时间】:2018-04-10 15:35:06
【问题描述】:

我在蓝图中有一些视图功能。它们如下所示:

@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 是相同的,我认为这就是导致问题的原因。

有什么办法吗?

【问题讨论】:

    标签: python flask python-unittest werkzeug


    【解决方案1】:

    这不是为同一 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"})
    

    【讨论】:

      【解决方案2】:

      不可能声明两个函数来分别处理 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"})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 2021-09-30
        • 2015-09-24
        • 1970-01-01
        • 2011-04-11
        相关资源
        最近更新 更多