首页 文章

从Flask视图返回JSON响应

提问于
浏览
299

我有一个功能,用Pandas分析CSV文件,并生成一个包含摘要信息的dict . 我想将结果作为Flask视图的响应返回 . 如何返回JSON响应?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json

8 回答

  • -2

    将摘要数据传递给jsonify函数,该函数返回JSON响应 .

    from flask import jsonify
    
    @app.route('/summary')
    def summary():
        d = make_summary()
        return jsonify(d)
    

    从Flask 0.11开始,您可以将任何JSON可序列化类型(不仅仅是dict)作为顶级对象传递 .

  • 497

    jsonify 将您传递给JSON的数据序列化 . 如果您想自己序列化数据,请通过使用 status=200mimetype='application/json' 构建响应来执行 jsonify 所做的操作 .

    from flask import json
    
    @app.route('/summary')
    def summary():
        data = make_summary()
        response = app.response_class(
            response=json.dumps(data),
            status=200,
            mimetype='application/json'
        )
        return response
    
  • 144

    将关键字参数传递给flask.jsonify,它们将作为JSON对象输出 .

    @app.route('/_get_current_user')
    def get_current_user():
        return jsonify(
            username=g.user.username,
            email=g.user.email,
            id=g.user.id
        )
    
    {
        "username": "admin",
        "email": "admin@localhost",
        "id": 42
    }
    
  • 92

    如果您由于某种原因不想使用 jsonify ,则可以手动执行此操作 . 调用 flask.json.dumps 以创建JSON数据,然后返回具有 application/json 内容类型的响应 .

    from flask import json
    
    @app.route('/summary')
    def summary():
        data = make_summary()
        response = app.response_class(
            response=json.dumps(data),
            mimetype='application/json'
        )
        return response
    
  • 15

    如果要分析用户上传的文件,Flask quickstart会显示如何从用户获取文件并访问它们 . 从 request.files 获取文件并将其传递给摘要函数 .

    from flask import request, jsonify
    from werkzeug import secure_filename
    
    @app.route('/summary', methods=['GET', 'POST'])
    def summary():
        if request.method == 'POST':
            csv = request.files['data']
            return jsonify(
                summary=make_summary(csv),
                csv_name=secure_filename(csv.filename)
            )
    
        return render_template('submit_data.html')
    

    'data''data' 键替换为HTML表单中输入文件的名称 .

  • 14

    您可以编写一个装饰器,将视图函数的返回值转换为JSON响应 .

    def return_json(view):
        @functools.wraps(view)
        def wrapped_view(**values):
            return jsonify(view(**values))
        return wrapped_view
    
    
    @app.route('/test/<arg>')
    @return_json
    def test(arg):
        if arg == 'list':
            return [1, 2, 3]
        elif arg == 'dict':
            return {'a': 1, 'b': 2}
        elif arg == 'bool':
            return True
        return 'non of them'
    
  • 6

    在Flask 0.11之前, jsonfiy 不允许直接返回数组 . 而是将列表作为关键字参数传递 .

    @app.route('/get_records')
    def get_records():
        results = [
            {
              "rec_create_date": "12 Jun 2016",
              "rec_dietary_info": "nothing",
              "rec_dob": "01 Apr 1988",
              "rec_first_name": "New",
              "rec_last_name": "Guy",
            },
            {
              "rec_create_date": "1 Apr 2016",
              "rec_dietary_info": "Nut allergy",
              "rec_dob": "01 Feb 1988",
              "rec_first_name": "Old",
              "rec_last_name": "Guy",
            },
        ]
        return jsonify(results=list)
    
  • 2

    如前所述,jsonify是最好的方法,或者您也可以在https://github.com/Parkayun/flask-responses使用 Flask-responses '包

    @app.route("/json")
    def hello():
        return json_response(your_dict, status_code=201)
    

相关问题