Py学习  »  Python

使用python flask读取多个文件[重复]

python_interest • 4 年前 • 1483 次点击  

我想能够将数据发送到我的烧瓶应用程序。我试过进入 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 接下来,是获取原始数据,而不是解析的数据。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38056
 
1483 次点击  
文章 [ 16 ]  |  最新文章 4 年前
aakash gupta
Reply   •   1 楼
aakash gupta    5 年前
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})
Ravin Gupta
Reply   •   2 楼
Ravin Gupta    5 年前
from flask import request

content = request.get_json()
name = content.get('name', '')

如果请求类型为json,则获取数据,您还可以同时提到默认参数。

from flask import request

content = request.form
name = content.get('name', '')

获取请求类型窗体的数据

from flask import request

request.args.get("name", "")

使用GET请求从URL获取参数

freezed
Reply   •   3 楼
freezed    5 年前

对于像我这样忘记了HTML的人,请确定 <input> 在你的 <form> 有一个 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([]) !

Syscall
Reply   •   4 楼
Syscall    5 年前

在javascript中:

var value_data = [1,2,3,4];

$.ajax({
        type: 'POST',
        url: '/',
        data:JSON.stringify(value_data),
        success: function (response) {
            alert("Data added successfully");
         },    
});

在python中:

client_data = request.get_data()
Paul Gowder
Reply   •   5 楼
Paul Gowder    5 年前

这是一种获取所有请求数据的恶意黑客,不管它是如何发送的,但我认真地使用了:

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并合并所有的dict。然后,可以将其记录下来,在一个视图函数中返回,无论它包含什么,您实际上都可以看到整个请求。

Zavec
Reply   •   6 楼
Zavec    5 年前

如果可以识别mime类型,则两者都可以 request.data request.get_data() 将返回空字符串。

不管怎样,要获取完整的内容,您需要打电话 request.get_data(as_text=True) .

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

Daniel
Reply   •   7 楼
Daniel    5 年前
length = request.headers["Content-Length"]
data=request.stream.read()

现在,数据是请求主体

ivanleoncz
Reply   •   8 楼
ivanleoncz    5 年前

使用 request.form .

而不是获取单个表单数据( request.form["field_name"] ,您可以通过分析 ImmutableDict 由提供 申请表 对象,如下所示:

烧瓶(路线)

@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) 

壳牌

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

有关详细信息,请参阅 Gist .

zhangqy
Reply   •   9 楼
zhangqy    6 年前

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

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

现在, g.data 是的一个实例 werkzeug.ImmutableMultiDict . 然后你可以用 G.数据 它可以满足您的大部分需求。例如,您可以这样使用它:

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

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

Tarik Fojnica
Reply   •   10 楼
Tarik Fojnica    6 年前
@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)
Xiao
Reply   •   11 楼
Xiao    8 年前

如果不管内容类型如何,都希望使用原始日志正文,则应使用 request.get_data() ,因为 request.form 已转换为 werkzeug.ImmutableMultiDict 格式。

Jochem Schulenklopper Amit Kar
Reply   •   12 楼
Jochem Schulenklopper Amit Kar    6 年前

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

标题:

{Content-Type: application/json}

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
kaushal agrawal Little Roys
Reply   •   13 楼
kaushal agrawal Little Roys    6 年前

我举了一个完整的例子 应用程序/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 对于POST请求:

enter image description here

使用 卷曲 命令:

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

Fizer Khan
Reply   •   14 楼
Fizer Khan    9 年前

简单如下

对于 URL查询参数 使用 请求.args

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

为了 表单输入 使用 申请表

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

对于 数据类型应用程序/json 使用 请求数据

# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
clyfish
Reply   •   15 楼
clyfish    11 年前
from flask import request
request.data
davidism SilentGhost
Reply   •   16 楼
davidism SilentGhost    6 年前

这个 docs 描述请求中可用的属性。在最常见的情况下 request.data 将为空,因为它用作回退:

请求数据 以字符串形式包含传入的请求数据,以防它附带的mimetype flask无法处理。

  • request.args :URL查询字符串中的键/值对
  • request.form :正文中的键/值对,来自HTML Post表单或不是JSON编码的JavaScript请求。
  • request.files :瓶身上的文件,烧瓶与 form . HTML表单必须使用 enctype=multipart/form-data 否则文件将无法上载。
  • request.values :组合 args 形式 ,首选 阿尔茨海默病 如果键重叠

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

  • request.form['name'] :如果知道密钥存在,请使用索引
  • request.form.get('name') 使用 get 如果密钥可能不存在
  • request.form.getlist('name') 使用 getlist 如果该键被多次发送,并且您需要一个值列表。 得到 只返回第一个值。