Dapatkan data yang diterima dalam permintaan Flask

736

Saya ingin bisa mendapatkan data yang dikirim ke aplikasi Flask saya. Saya sudah mencoba mengakses request.datatetapi ini adalah string kosong. Bagaimana Anda mengakses data permintaan?

from flask import request

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

Jawaban untuk pertanyaan ini mengarahkan saya untuk bertanya Dapatkan badan POST mentah dalam Python Flask terlepas dari header Tipe-Konten berikutnya, yaitu tentang mendapatkan data mentah daripada data yang diuraikan.

ddinchev
sumber

Jawaban:

1266

The docs menggambarkan atribut yang tersedia pada permintaan. Dalam kebanyakan kasus request.dataakan kosong karena digunakan sebagai mundur:

request.data Berisi data permintaan yang masuk sebagai string jika itu datang dengan Flask mimetype tidak menangani.

  • request.args: pasangan kunci / nilai dalam string kueri URL
  • request.form: pasangan kunci / nilai di badan, dari formulir posting HTML, atau permintaan JavaScript yang tidak dikodekan JSON
  • request.files: file dalam tubuh, yang disimpan Flask terpisah form. Formulir HTML harus digunakan enctype=multipart/form-dataatau file tidak akan diunggah.
  • request.values: gabungan argsdan form, lebih suka argsjika tumpang tindih
  • request.json: data JSON yang diuraikan. Permintaan harus memiliki application/jsontipe konten, atau gunakan request.get_json(force=True)untuk mengabaikan tipe konten.

Semua ini adalah MultiDictcontoh (kecuali untuk json). Anda dapat mengakses nilai menggunakan:

  • request.form['name']: gunakan pengindeksan jika Anda tahu kunci ada
  • request.form.get('name'): gunakan getjika kunci mungkin tidak ada
  • request.form.getlist('name'): gunakan getlistjika kunci dikirim beberapa kali dan Anda ingin daftar nilai. gethanya mengembalikan nilai pertama.
Robert
sumber
204

Untuk mendapatkan data mentah, gunakan request.data. Ini hanya berfungsi jika tidak dapat diuraikan sebagai data formulir, jika tidak maka akan kosong dan request.formakan memiliki data yang diuraikan.

from flask import request
request.data
clyfish
sumber
178

Untuk parameter kueri URL, gunakan request.args.

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

Untuk input formulir yang diposting, gunakan request.form.

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

Untuk JSON yang diposkan dengan tipe konten application/json, gunakan request.get_json().

data = request.get_json()
Fizer Khan
sumber
98

Berikut adalah contoh parsing data JSON yang diposkan dan mengulanginya kembali.

from flask import Flask, request, jsonify

app = Flask(__name__)

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

Untuk memposting JSON dengan curl:

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

Atau menggunakan tukang pos:

menggunakan tukang pos untuk memposting JSON

Roy kecil
sumber
36

Jika Anda memposting JSON dengan tipe konten application/json, gunakan request.get_json()untuk mendapatkannya di Flask. Jika jenis konten tidak benar, Nonedikembalikan. Jika data bukan JSON, kesalahan akan muncul.

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

Untuk mendapatkan isi kiriman mentah terlepas dari jenis konten, gunakan request.get_data(). Jika Anda menggunakan request.data, itu panggilan request.get_data(parse_form_data=True), yang akan mengisi request.form MultiDictdan biarkan datakosong.

Xiao
sumber
18

Untuk mendapatkan request.formkamus normal, gunakan request.form.to_dict(flat=False).

Untuk mengembalikan data JSON untuk suatu API, kirimkan ke jsonify.

Contoh ini mengembalikan data formulir sebagai data JSON.

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

Berikut adalah contoh data formulir POST dengan curl, yang dikembalikan sebagai JSON:

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

Gunakan request.get_json()untuk mendapatkan data JSON yang diposting.

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

Gunakan request.formuntuk mendapatkan data saat mengirimkan formulir dengan metode POST.

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

Gunakan request.argsuntuk mendapatkan data yang dikirimkan dalam string kueri URL, seperti saat mengirimkan formulir dengan metode GET.

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

request.formdll seperti dict, gunakan getmetode untuk mendapatkan nilai dengan default jika tidak dilewatkan.

Ravin Gupta
sumber
10

Untuk mendapatkan JSON diposkan tanpa application/jsonjenis konten, gunakan 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)
Tarik Fojnica
sumber
10

Data mentah diteruskan ke aplikasi Flask dari server WSGI sebagai request.stream. Panjang aliran ada di Content-Lengthheader.

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

Biasanya lebih aman untuk digunakan request.get_data().

Daniel
sumber
9

Untuk memposting JSON dengan jQuery di JavaScript, gunakan JSON.stringifyuntuk membuang data, dan atur jenis konten ke 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");
    }   
});

Pecahkan dalam Flask dengan request.get_json().

data = request.get_json()
vaishali chaudhari
sumber
8

Untuk mem-parse JSON, gunakan request.get_json().

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

Berikut adalah contoh dari memposting data formulir untuk menambahkan pengguna ke database. Periksa request.method == "POST"untuk memeriksa apakah formulir telah diserahkan. Gunakan kunci dari request.formuntuk mendapatkan data formulir. Berikan template HTML dengan yang <form>sebaliknya. Bidang dalam formulir harus memiliki nameatribut yang cocok dengan kunci di 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>
Dulangi_Kanchana
sumber
4

Jika tipe konten dikenali sebagai data formulir, request.dataakan menguraikannya ke dalam request.formdan mengembalikan string kosong.

Untuk mendapatkan data mentah terlepas dari jenis konten, hubungi request.get_data(). request.datapanggilan get_data(parse_form_data=True), sedangkan standarnya adalah Falsejika Anda memanggilnya secara langsung.

Zavec
sumber
4

Jika badan dikenali sebagai data formulir, itu akan di request.form. Jika itu JSON, maka akan di request.get_json(). Kalau tidak, data mentah akan masuk request.data. Jika Anda tidak yakin bagaimana data akan dikirimkan, Anda dapat menggunakan orrantai untuk mendapatkan yang pertama dengan data.

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

request.argsberisi args yang diuraikan dari string kueri, terlepas dari apa yang ada di dalam tubuh, jadi Anda akan menghapusnya dari get_request_data()apakah itu dan sebuah badan harus data pada saat yang sama.

Paul Gowder
sumber
2

Saat memposting data formulir dengan formulir HTML, pastikan inputtag memiliki nameatribut, jika tidak, tag tersebut tidak akan hadir 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')])

Hanya txt3masukan memiliki name, sehingga yang hadir hanya kunci dalam request.form.

dibekukan
sumber