首页 文章

如何在Flask请求中获取数据

提问于
浏览
453

我希望能够将数据发送到我的Flask应用程序 . 我试过访问 request.data 但它是一个空字符串 . 你如何访问请求数据?

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here

这个问题的答案让我问下Get raw POST body in Python Flask regardless of Content-Type header,这是关于获取原始数据而不是解析数据 .

15 回答

  • -1
    from flask import request
    request.data
    
  • 129

    简单来说,您可以通过以下方式获取数据:

    @app.before_request
    def before_request():
        g.data = request.get_json() or request.values
    

    现在, g.datawerkzeug.ImmutableMultiDict 的一个实例 . 然后你可以使用 g.data 来处理你的大多数要求 . 例如,您可以像这样使用它:

    @app.route("/something", methods=["POST"])
    def do_something():
        result = handle(g.data)
        return jsonify(data=result)
    

    当然,您可以使用 blueprint 而不是 app ~~

  • 166

    这是一个肮脏的黑客,无论如何发送所有请求数据,但我认真使用:

    def get_request_info():
        args = str(request.args)
        form = str(request.form)
        files = str(request.files)
        maybe_json = request.get_json(silent=True, cache=False)
        if maybe_json:
            thejson = json.dumps(maybe_json)
        else:
            thejson = "no json"
        return # whatever you want
    

    然后我只返回一个连接这些字符串的字符串,或者,如果我觉得很奇特,我跳过字符串调用/ json dump并合并所有的dicts . 然后这可以被记录,在视图函数中返回,无论如何,无论它包含什么,您都可以实际看到整个请求 .

  • 25
    len = request.headers["Content-Length"]
    data=request.stream.read()
    

    现在,数据是请求体

  • 3

    如果识别出mime类型,则 request.datarequest.get_data() 都将返回空字符串 .

    要获得完整内容,您需要调用 request.get_data(as_text=True) .

    http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data

  • 4
    @app.route('/', methods=['POST'])
    def process_data():
        req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
        language = req_data['language'] # or whatever key you have in your json
    
        return '''The language value is: {}'''.format(language)
    
  • 744

    我给出了 application/json 的完整示例:

    from flask import Flask, abort, request 
    import json
    
    app = Flask(__name__)
    
    
    @app.route('/foo', methods=['POST']) 
    def foo():
        if not request.json:
            abort(400)
        print request.json
        return json.dumps(request.json)
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000, debug=True)
    

    使用Postman发布请求:

    enter image description here

    使用 curl 命令:

    curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
    

    附:对于URL查询参数示例,您可以在Multiple parameters in in Flask approute中查看我的答案

  • 7

    如果您想要原始帖子正文而不考虑内容类型,则应使用 request.get_data() ,因为 request.form 已转换为 werkzeug.ImmutableMultiDict 格式 .

  • 1

    In javascript:

    var value_data = [1,2,3,4];
    
    $.ajax({
            type: 'POST',
            url: '/',
            data:JSON.stringify(value_data),
            success: function (response) {
                alert("Data added successfully");
             },    
    });
    

    In python:

    client_data = request.get_data()
    
  • 51

    它简单如下

    对于 URL Query parameter ,请使用 request.args

    search = request.args.get("search")
    page = request.args.get("page")
    

    对于 Form input ,请使用 request.form

    email = request.form.get('email')
    password = request.form.get('password')
    

    对于 data type application/json ,请使用 request.data

    # data in string format and you have to parse into dictionary
    data = request.data
    dataDict = json.loads(data)
    
  • 17

    docs描述了请求中可用的属性 . 在大多数常见情况下 request.data 将为空,因为它被用作后备:

    request.data包含传入的请求数据作为字符串,以防它带有Flask无法处理的mimetype .

    • request.args :URL查询字符串中的键/值对

    • request.form :正文中的键/值对,来自HTML帖子表单或非JSON编码的JavaScript请求

    • request.files :正文中的文件,Flask与 form 分开 . HTML表单必须使用 enctype=multipart/form-data 或文件不会上传 .

    • request.values :合并 argsform ,如果按键重叠则更喜欢 args

    所有这些都是MultiDict个实例 . 您可以使用以下方法访问值

    • request.form['name'] :如果您知道密钥存在,请使用索引

    • request.form.get('name') :如果密钥可能不存在,请使用 get

    • request.form.getlist('name') :如果多次发送密钥并且您想要一个值列表,请使用 getlist . get 仅返回第一个值 .

  • 4

    Flask还有另一个JSON快捷方式:

    Headers :

    {Content-Type: application/json}
    
    @app.route("/something", methods=["POST"])
    def do_something():
        data = request.get_json()
    
  • 0
    from flask import Flask, request, jsonify
    
    @app.route('/added', methods=['POST'])
    def add():
        data = request.get_json(force=True)
        l = {'name': data['name']}
        lingual.append(l)
    
        return jsonify({'lang': lingual})
    
  • 7

    使用 request.form .

    您可以通过解析 request.form 对象提供的 ImmutableDict 来获取所有发布的数据,而不是获取单个表单数据( request.form["field_name"] ),如下所示:

    Flask (Route)

    @app.route('/data', methods=['POST'])                                           
    def f_data():                                                                   
        if request.method == "POST":
            fields = [k for k in request.form]                                      
            values = [request.form[k] for k in request.form]
            data = dict(zip(fields, values))
        return jsonify(data)
    

    Shell

    $ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
    {
      "name": "ivanleoncz", 
      "role": "Software Developer"
    }
    

    有关详细信息,请Gist .

  • 1

    对于那些忘记(有点)HTML的人,请确保 <form> 中的 <input> 具有 name="" 属性!

    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        print("Posted data : {}".format(request.form))
    
        return """
    <form method="post">
        <input type="text">
        <input type="text" id="idtxt2">
        <input type="text" name="txt3" id="idtxt3">  
        <input type="submit" Value="Hopla!">
    </form>
    """
    
    if __name__ == "__main__":
        app.run()
    

    控制台上的结果:

    freezed@machine % python3 run.py
     * Serving Flask app "flaskstuff.views" (lazy loading)
     * Environment: production
       WARNING: Do not use the development server in a production environment.
       Use a production WSGI server instead.
     * Debug mode: on
     * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 268-634-781
    127.0.0.1 - - [20/Aug/2018 16:52:59] "POST / HTTP/1.1" 200 -
    Posted data : ImmutableMultiDict([('txt3', 'text 3')])
    

    ImmutableMultiDict([]) 中没有name属性= no data

相关问题