ddi*_*hev 623 python werkzeug flask
我希望能够将数据发送到我的Flask应用程序.我试过访问request.data但它是一个空字符串.你如何访问请求数据?
@app.route('/', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
Run Code Online (Sandbox Code Playgroud)
这个问题的答案促使我在Python Flask中询问获取原始POST主体,而不管接下来是Content-Type标头,这是关于获取原始数据而不是解析数据.
Rob*_*ert 1034
该文档描述的要求提供的属性.在大多数常见情况下,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:组合,args并且form,args如果键重叠,则更喜欢所有这些都是request.json实例.您可以使用以下方法访问值
application/json:如果您知道密钥存在,请使用索引request.get_json(force=True):MultiDict如果密钥可能不存在,请使用json:request.form['name']如果密钥被多次发送并且您想要一个值列表,请使用.request.form.get('name')只返回第一个值.Fiz*_*han 163
它简单如下
对于URL Query参数,请使用request.args
search = request.args.get("search")
page = request.args.get("page")
Run Code Online (Sandbox Code Playgroud)
对于表单输入,请使用request.form
email = request.form.get('email')
password = request.form.get('password')
Run Code Online (Sandbox Code Playgroud)
对于数据类型application/json,请使用request.data
data = request.get_json()
Run Code Online (Sandbox Code Playgroud)
Lit*_*oys 80
我给出了application/json的完整示例:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/foo', methods=['POST'])
def foo():
data = request.json
return jsonify(data)
Run Code Online (Sandbox Code Playgroud)
使用Postman邮寄请求:
使用curl命令:
curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
Run Code Online (Sandbox Code Playgroud)
PS对于URL查询参数示例,您可以在Flask approute中的多个参数中查看我的答案
小智 33
Flask还有另一个JSON快捷方式:
标题:
@app.route("/something", methods=["POST"])
def do_something():
data = request.get_json()
Run Code Online (Sandbox Code Playgroud)
小智 31
您可以从以下位置获取请求数据
request.form对于表单数据,这包括表单和文件数据,request.json对于request.get_jsonJSON 数据request.headers对于标题request.args获取查询参数它们都像一本字典,request.form['name']如果您知道键存在或者request.form.get('name')它是可选的,则可以使用它们。
Xia*_*iao 26
如果你想要原始的帖子体而不管内容类型,你应该使用request.get_data(),因为request.data转换为request.get_data(parse_form_data=True)格式.
Mur*_*rad 26
导入请求:
from flask import request
Run Code Online (Sandbox Code Playgroud)
网址查询参数:
name = request.args.get("name")
age = request.args.get("age")
Run Code Online (Sandbox Code Playgroud)
表单输入:
name = request.form.get('name')
age = request.form.get('age')
Run Code Online (Sandbox Code Playgroud)
OR(如果您知道键存在,请使用索引,指定输入字段的名称)
name = request.form['name']
age = request.form['age']
Run Code Online (Sandbox Code Playgroud)
JSON 数据(对于内容类型application/json)
data = request.get_json()
Run Code Online (Sandbox Code Playgroud)
小智 16
要在 JavaScript 中使用 jQuery 发布 JSON,请使用JSON.stringify转储数据,并将内容类型设置为application/json.
var value_data = [1, 2, 3, 4];
$.ajax({
type: 'POST',
url: '/process',
data: JSON.stringify(value_data),
contentType: 'application/json',
success: function (response_data) {
alert("success");
}
});
Run Code Online (Sandbox Code Playgroud)
在 Flask 中使用request.get_json().
data = request.get_json()
Run Code Online (Sandbox Code Playgroud)
iva*_*ncz 12
用request.form.
request.form.to_dict(flat=False)您可以通过解析MultiDict由jsonify对象提供的内容来获取所有发布的数据,而不是获取单个表单数据(),如下所示:
烧瓶(路线)
@app.route('/form_to_json', methods=['POST'])
def form_to_json():
data = request.form.to_dict(flat=False)
return jsonify(data)
Run Code Online (Sandbox Code Playgroud)
贝壳
$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
"name": "ivanleoncz",
"role": "Software Developer"
}
Run Code Online (Sandbox Code Playgroud)
更多细节,这个要点.
小智 12
这是发布表单数据以将用户添加到数据库的示例。检查request.method == "POST"以检查表单是否已提交。使用来自的键request.form来获取表单数据。使用<form>其他方式呈现 HTML 模板。表单中的字段应具有name与 中的键匹配的属性request.form。
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/user/add", methods=["GET", "POST"])
def add_user():
if request.method == "POST":
user = User(
username=request.form["username"],
email=request.form["email"],
)
db.session.add(user)
db.session.commit()
return redirect(url_for("index"))
return render_template("add_user.html")
Run Code Online (Sandbox Code Playgroud)
<form method="post">
<label for="username">Username</label>
<input type="text" name="username" id="username">
<label for="email">Email</label>
<input type="email" name="email" id="email">
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
小智 10
@app.route('/process_data', methods=['POST'])
def process_data():
req_data = request.get_json(force=True)
language = req_data['language']
return 'The language value is: {}'.format(language)
Run Code Online (Sandbox Code Playgroud)
length = request.headers["Content-Length"]
data = request.stream.read(length)
Run Code Online (Sandbox Code Playgroud)
现在,数据是请求体
简单来说,您可以通过以下方式获取数据:
@app.route("/something", methods=["POST"])
def do_something():
result = handle(request.get_json())
return jsonify(data=result)
Run Code Online (Sandbox Code Playgroud)
现在,request.get_json()是一个实例request.get_json().然后您可以使用request.get_json()哪个可以满足您的大部分要求.例如,您可以像这样使用它:
@app.route("/something", methods=["POST"])
def do_something():
result = handle(request.get_json())
return jsonify(data=result)
Run Code Online (Sandbox Code Playgroud)
当然,你可以用request.get_json()而不是request.get_json()~~
如果正文被识别为表单数据,它将在request.form. 如果是 JSON,它将在request.get_json(). 否则原始数据将在request.data. 如果您不确定数据将如何提交,您可以使用or链来获取第一个数据。
def get_request_data():
return (
request.args
or request.form
or request.get_json(force=True, silent=True)
or request.data
)
Run Code Online (Sandbox Code Playgroud)
request.args包含从查询字符串解析的 args,而不管正文中的内容,因此get_request_data()如果它和正文都应该同时提供数据,您将删除它。
小智 8
使用request.get_json()得到张贴JSON数据。
data = request.get_json()
name = data.get('name', '')
Run Code Online (Sandbox Code Playgroud)
使用request.formPOST方法提交表单时用于获取数据。
name = request.form.get('name', '')
Run Code Online (Sandbox Code Playgroud)
使用request.args得到的网址,用GET方法提交表单的时候喜欢的查询字符串传递的数据。
request.args.get("name", "")
Run Code Online (Sandbox Code Playgroud)
request.form等类似dict,get如果未通过默认值,请使用方法获取值。
在编写一个应该发送 JSON 数据的 Slack 机器人时,我Content-Type在application/x-www-form-urlencoded.
我试过了request.get_json(),没有用。
@app.route('/process_data', methods=['POST'])
def process_data():
req_data = request.get_json(force=True)
Run Code Online (Sandbox Code Playgroud)
相反,我曾经request.form获取包含JSON的表单数据字段,然后加载它。
from flask import json
@ app.route('/slack/request_handler', methods=['POST'])
def request_handler():
req_data = json.loads(request.form["payload"])
Run Code Online (Sandbox Code Playgroud)
如果内容类型被识别为表单数据,request.data则将其解析为request.form并返回一个空字符串。
无论内容类型如何,要获取原始数据,请调用request.get_data(). request.data调用get_data(parse_form_data=True),而默认值是False直接调用它。
@app.route('/addData', methods=['POST'])
def add_data():
data_in = mongo.db.Data
id = request.values.get("id")
name = request.values.get("name")
newuser = {'id' : id, 'name' : name}
if voter.find({'id' : id, 'name' : name}).count() > 0:
return "Data Exists"
else:
data_in.insert(newuser)
return "Data Added"
Run Code Online (Sandbox Code Playgroud)
当使用 HTML 表单发布表单数据时,请确保标签input具有name属性,否则它们将不会出现在request.form.
@app.route('/', methods=['GET', 'POST'])
def index():
print(request.form)
return """
<form method="post">
<input type="text">
<input type="text" id="txt2">
<input type="text" name="txt3" id="txt3">
<input type="submit">
</form>
"""
Run Code Online (Sandbox Code Playgroud)
@app.route('/', methods=['GET', 'POST'])
def index():
print(request.form)
return """
<form method="post">
<input type="text">
<input type="text" id="txt2">
<input type="text" name="txt3" id="txt3">
<input type="submit">
</form>
"""
Run Code Online (Sandbox Code Playgroud)
只有txt3输入有 a name,所以它是 中存在的唯一键request.form。
| 归档时间: |
|
| 查看次数: |
724235 次 |
| 最近记录: |