Nhận dữ liệu nhận được trong một yêu cầu Flask


736

Tôi muốn có thể nhận dữ liệu được gửi đến ứng dụng Flask của mình. Tôi đã thử truy cập request.datanhưng nó là một chuỗi trống. Làm thế nào để bạn truy cập dữ liệu yêu cầu?

from flask import request

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

Câu trả lời cho câu hỏi này khiến tôi phải hỏi Nhận phần thân POST thô trong Python Flask bất kể tiêu đề Kiểu nội dung tiếp theo, đó là về việc lấy dữ liệu thô thay vì dữ liệu được phân tích cú pháp.

Câu trả lời:


1265

Các tài liệu mô tả các thuộc tính có sẵn theo yêu cầu. Trong hầu hết các trường hợp phổ biến request.datasẽ trống vì nó được sử dụng như một dự phòng:

request.data Chứa dữ liệu yêu cầu đến dưới dạng chuỗi trong trường hợp nó đi kèm với một Flask mimetype không xử lý.

  • request.args: các cặp khóa / giá trị trong chuỗi truy vấn URL
  • request.form: các cặp khóa / giá trị trong phần thân, từ một dạng bài đăng HTML hoặc yêu cầu JavaScript không được mã hóa JSON
  • request.files: các tệp trong phần thân, mà Flask giữ tách biệt form. Các hình thức HTML phải sử dụng enctype=multipart/form-datahoặc các tệp sẽ không được tải lên.
  • request.values: kết hợp argsform, thích hơn argsnếu các khóa trùng nhau
  • request.json: phân tích dữ liệu JSON. Yêu cầu phải có application/jsonloại nội dung hoặc sử dụng request.get_json(force=True)để bỏ qua loại nội dung.

Tất cả những điều này là MultiDicttrường hợp (trừ json). Bạn có thể truy cập các giá trị bằng cách sử dụng:

  • request.form['name']: sử dụng lập chỉ mục nếu bạn biết khóa tồn tại
  • request.form.get('name'): sử dụng getnếu khóa có thể không tồn tại
  • request.form.getlist('name'): sử dụng getlistnếu khóa được gửi nhiều lần và bạn muốn có một danh sách các giá trị. getchỉ trả về giá trị đầu tiên.

204

Để có được dữ liệu thô, sử dụng request.data. Điều này chỉ hoạt động nếu nó không thể được phân tích cú pháp dưới dạng dữ liệu biểu mẫu, nếu không nó sẽ trống và request.formsẽ có dữ liệu được phân tích cú pháp.

from flask import request
request.data

178

Đối với các tham số truy vấn URL, sử dụng request.args.

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

Đối với đầu vào mẫu đăng, sử dụng request.form.

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

Đối với JSON được đăng với loại nội dung application/json, sử dụng request.get_json().

data = request.get_json()

98

Đây là một ví dụ về phân tích dữ liệu JSON được đăng và lặp lại dữ liệu đó.

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/foo', methods=['POST']) 
def foo():
    data = request.json
    return jsonify(data)

Để đăng JSON với curl:

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

Hoặc để sử dụng Postman:

sử dụng postman để đăng JSON


36

Nếu bạn đăng JSON với loại nội dung application/json, hãy sử dụng request.get_json()để lấy nó trong Flask. Nếu loại nội dung không chính xác, Noneđược trả lại. Nếu dữ liệu không phải là JSON, một lỗi sẽ xuất hiện.

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()

31

Để có được nội dung bài thô bất kể loại nội dung, sử dụng request.get_data(). Nếu bạn sử dụng request.data, nó sẽ gọi request.get_data(parse_form_data=True), nó sẽ điền request.form MultiDictvà để datatrống.


18

Để có được request.formnhư một từ điển bình thường, sử dụng request.form.to_dict(flat=False).

Để trả về dữ liệu JSON cho API, hãy chuyển nó tới jsonify .

Ví dụ này trả về dữ liệu biểu mẫu dưới dạng dữ liệu JSON.

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

Đây là một ví dụ về dữ liệu biểu mẫu POST với curl, trả về dưới dạng JSON:

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

12

Sử dụng request.get_json()để có được dữ liệu JSON được đăng.

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

Sử dụng request.formđể nhận dữ liệu khi gửi biểu mẫu bằng phương thức POST.

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

Sử dụng request.argsđể nhận dữ liệu được truyền trong chuỗi truy vấn của URL, như khi gửi biểu mẫu bằng phương thức GET.

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

request.formv.v ... giống như dict, sử dụng getphương thức để lấy giá trị với mặc định nếu nó không được thông qua.


10

Để nhận JSON được đăng mà không cần application/jsonloại nội dung, hãy sử dụng request.get_json(force=True).

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

10

Dữ liệu thô được truyền vào ứng dụng Flask từ máy chủ WSGI dưới dạng request.stream. Độ dài của luồng nằm trong Content-Lengthtiêu đề.

length = request.headers["Content-Length"]
data = request.stream.read(length)

Nó thường an toàn hơn để sử dụng request.get_data()thay thế.


9

Để đăng JSON với jQuery bằng JavaScript, hãy sử dụng JSON.stringifyđể kết xuất dữ liệu và đặt loại nội dung thành 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");
    }   
});

Phân tích nó trong Flask với request.get_json().

data = request.get_json()

8

Để phân tích JSON, sử dụng request.get_json().

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

5

Đây là một ví dụ về việc đăng dữ liệu biểu mẫu để thêm người dùng vào cơ sở dữ liệu. Kiểm tra request.method == "POST"để kiểm tra nếu mẫu đã được gửi. Sử dụng các khóa từ request.formđể có được dữ liệu biểu mẫu. Kết xuất một mẫu HTML bằng <form>cách khác. Các trường trong biểu mẫu phải có namecác thuộc tính khớp với các khóa trong 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")
<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>

4

Nếu loại nội dung được nhận dạng là dữ liệu biểu mẫu, request.datasẽ phân tích thànhrequest.form và trả về một chuỗi trống.

Để có được dữ liệu thô bất kể loại nội dung, hãy gọi request.get_data(). request.datacác cuộc gọi get_data(parse_form_data=True), trong khi mặc định là Falsenếu bạn gọi nó trực tiếp.


4

Nếu cơ thể được công nhận là dữ liệu biểu mẫu, nó sẽ ở trong request.form. Nếu là JSON, nó sẽ xuất hiện request.get_json(). Nếu không, dữ liệu thô sẽ được trong request.data. Nếu bạn không chắc chắn cách dữ liệu sẽ được gửi, bạn có thể sử dụng orchuỗi để lấy chuỗi đầu tiên có dữ liệu.

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.argschứa các đối số được phân tích cú pháp từ chuỗi truy vấn, bất kể nội dung trong phần thân là gì, vì vậy bạn sẽ xóa phần đó khỏi get_request_data()nếu cả phần tử và phần thân nên dữ liệu cùng một lúc.


2

Khi đăng dữ liệu biểu mẫu bằng biểu mẫu HTML, hãy đảm bảo các inputthẻ có namethuộc tính, nếu không chúng sẽ không xuất hiện 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>
"""
ImmutableMultiDict([('txt3', 'text 3')])

Chỉ có txt3đầu vào có một name, vì vậy nó là chìa khóa duy nhất hiện diện request.form.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.