Bir Flask isteğinde alınan verileri alma


736

Flask uygulamama gönderilen verileri alabilmek istiyorum. Erişmeye çalıştım request.dataama boş bir dize. İstek verilerine nasıl erişiyorsunuz?

from flask import request

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

Bu sorunun cevabı, bir sonraki Content-Type başlığından bağımsız olarak Python Flask'ta ham POST gövdesi al sormamı sağladı , bu da ayrıştırılmış veriler yerine ham verileri almakla ilgili.

Yanıtlar:


1265

Dokümanlar talep üzerine özellikler kullanılabilir açıklar. Çoğu durumda request.data, yedek olarak kullanıldığından boş olacaktır:

request.data Bir mime türü ile gelmesi durumunda gelen istek verilerini dize olarak içerir.

  • request.args: URL sorgu dizesindeki anahtar / değer çiftleri
  • request.form: HTML yazı formundan veya JSON kodlu olmayan JavaScript isteğinden gövdedeki anahtar / değer çiftleri
  • request.files: Flask'ın ayrı tuttuğu vücuttaki dosyalar form. HTML formları kullanmalıdır enctype=multipart/form-data, aksi takdirde dosyalar yüklenmez.
  • request.values: birleştirilmiş argsve tuşların çakışması durumunda formtercihargs
  • request.json: JSON verilerini ayrıştırdı. İstek application/jsoniçerik türüne sahip olmalı veya request.get_json(force=True)içerik türünü yoksaymak için kullanılmalıdır .

Bunların hepsi MultiDict(hariç json) örnekleridir . Değerlere aşağıdakileri kullanarak erişebilirsiniz:

  • request.form['name']: anahtarın mevcut olduğunu biliyorsanız dizin oluşturmayı kullanın
  • request.form.get('name'): getanahtar mevcut değilse kullanın
  • request.form.getlist('name'): getlistanahtar birden çok kez gönderildiyse ve bir değer listesi istiyorsanız kullanın. getyalnızca ilk değeri döndürür.

204

Ham verileri almak için kullanın request.data. Bu yalnızca form verisi olarak ayrıştırılamadığında çalışır, aksi takdirde boş olur ve request.formayrıştırılan verilere sahip olur.

from flask import request
request.data

178

URL sorgu parametreleri için kullanın request.args.

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

Kayıtlı form girişi için kullanın request.form.

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

JSON için içerik türü ile yayınlanmıştır application/json, kullanım request.get_json().

data = request.get_json()

98

Burada, yayınlanan JSON verilerini ayrıştırma ve tekrar yankılama örneği verilmiştir.

from flask import Flask, request, jsonify

app = Flask(__name__)

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

JSON'u curl ile göndermek için:

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

Veya Postacı'yı kullanmak için:

JSON göndermek için postacı kullanma


36

JSON'u içerik türüyle gönderiyorsanız application/json, request.get_json()bunu Flask'a almak için kullanın . İçerik türü doğru değilse Nonedöndürülür. Veriler JSON değilse, bir hata oluşur.

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

31

İçerik türünden bağımsız olarak ham post gövdesini almak için kullanın request.get_data(). Eğer kullanırsanız request.data, bu aramaları request.get_data(parse_form_data=True)dolduracaktır hangi request.form MultiDictve ayrılmak databoş.


18

request.formNormal sözlük olarak almak için tuşunu kullanın request.form.to_dict(flat=False).

Bir API için JSON verisini döndürmek üzere, onu iletin jsonify.

Bu örnek, form verilerini JSON verileri olarak döndürür.

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

JSON olarak döndürülen kıvrımlı POST form verilerinin bir örneği:

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

12

request.get_json()Gönderilen JSON verilerini almak için kullanın .

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

request.formPOST yöntemiyle form gönderirken veri almak için kullanın .

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

request.argsGET yöntemiyle form gönderirken olduğu gibi, URL'nin sorgu dizesinde iletilen verileri almak için kullanın .

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

request.formvb. dikteye benziyorsa, getgeçilmediyse varsayılanla bir değer almak için yöntemi kullanın.


10

JSON'un application/jsoniçerik türü olmadan yayınlanmasını sağlamak için düğmesini kullanın 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

Ham veriler WSGI sunucusundan Flask uygulamasına aktarılır request.stream. Akışın uzunluğu Content-Lengthbaşlıktadır.

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

Bunun request.get_data()yerine kullanımı genellikle daha güvenlidir .


9

JSON'u jQuery ile JavaScript'te yayınlamak JSON.stringifyiçin, verileri dökümü kullanın ve içerik türünü olarak ayarlayın 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");
    }   
});

İle Flask içinde ayrıştırın request.get_json().

data = request.get_json()

8

JSON'u ayrıştırmak için kullanın request.get_json().

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

5

Aşağıda, veritabanına kullanıcı eklemek için form verilerini yayınlamanın bir örneği verilmiştir. Kontrol request.method == "POST"form gönderildiğinde olup olmadığını kontrol etmek. request.formForm verilerini almak için ile arasındaki tuşları kullanın . <form>Aksi halde bir HTML şablonu oluşturun . Formdaki alanların, nameiçindeki anahtarlarla eşleşen nitelikleri olmalıdır 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

İçerik türü form verileri olarak tanınırsa, request.databunu ayrıştırır request.formve boş bir dizeye döndürür.

İçerik türünden bağımsız olarak ham verileri almak için arayın request.get_data(). request.dataçağıran get_data(parse_form_data=True)varsayılan olsa, Falsedoğrudan çağrı eğer.


4

Gövde form verisi olarak tanınırsa, içeride olacaktır request.form. JSON ise, içeride olacaktır request.get_json(). Aksi takdirde ham veriler içeride olacaktır request.data. Verilerin nasıl gönderileceğinden emin değilseniz or, ilk veriyi almak için bir zincir kullanabilirsiniz .

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

request.args, gövdede ne olduğuna bakılmaksızın sorgu dizesinden ayrıştırılmış bağımsız değişkenler içerir get_request_data().


2

Form verilerini HTML formuyla gönderirken, inputetiketlerin nameözniteliklere sahip olduğundan emin olun , aksi takdirde bulunmazlar 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')])

Sadece txt3girişte bir tane vardı name, bu yüzden mevcut tek anahtar request.form.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.