我希望能够将数据发送到我的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 回答
简单来说,您可以通过以下方式获取数据:
现在,
g.data
是werkzeug.ImmutableMultiDict
的一个实例 . 然后你可以使用g.data
来处理你的大多数要求 . 例如,您可以像这样使用它:当然,您可以使用
blueprint
而不是app
~~这是一个肮脏的黑客,无论如何发送所有请求数据,但我认真使用:
然后我只返回一个连接这些字符串的字符串,或者,如果我觉得很奇特,我跳过字符串调用/ json dump并合并所有的dicts . 然后这可以被记录,在视图函数中返回,无论如何,无论它包含什么,您都可以实际看到整个请求 .
现在,数据是请求体
如果识别出mime类型,则
request.data
和request.get_data()
都将返回空字符串 .要获得完整内容,您需要调用
request.get_data(as_text=True)
.见http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data
我给出了 application/json 的完整示例:
使用Postman发布请求:
使用 curl 命令:
附:对于URL查询参数示例,您可以在Multiple parameters in in Flask approute中查看我的答案
如果您想要原始帖子正文而不考虑内容类型,则应使用
request.get_data()
,因为request.form
已转换为werkzeug.ImmutableMultiDict
格式 .In javascript:
In python:
它简单如下
对于 URL Query parameter ,请使用 request.args
对于 Form input ,请使用 request.form
对于 data type application/json ,请使用 request.data
docs描述了请求中可用的属性 . 在大多数常见情况下
request.data
将为空,因为它被用作后备:request.args
:URL查询字符串中的键/值对request.form
:正文中的键/值对,来自HTML帖子表单或非JSON编码的JavaScript请求request.files
:正文中的文件,Flask与form
分开 . HTML表单必须使用enctype=multipart/form-data
或文件不会上传 .request.values
:合并args
和form
,如果按键重叠则更喜欢args
所有这些都是MultiDict个实例 . 您可以使用以下方法访问值
request.form['name']
:如果您知道密钥存在,请使用索引request.form.get('name')
:如果密钥可能不存在,请使用get
request.form.getlist('name')
:如果多次发送密钥并且您想要一个值列表,请使用getlist
.get
仅返回第一个值 .Flask还有另一个JSON快捷方式:
Headers :
使用
request.form
.您可以通过解析
request.form
对象提供的ImmutableDict
来获取所有发布的数据,而不是获取单个表单数据(request.form["field_name"]
),如下所示:Flask (Route)
Shell
有关详细信息,请Gist .
对于那些忘记(有点)HTML的人,请确保
<form>
中的<input>
具有name=""
属性!控制台上的结果:
ImmutableMultiDict([])
中没有name属性= no data !