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.

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.

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

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

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


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

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.


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"
}

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.


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)

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().


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

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)

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>

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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.