Отримати дані, отримані у запиті на колбу


735

Я хочу мати змогу отримати дані, відправлені в мій додаток Flask. Я намагався отримати доступ, request.dataале це порожній рядок. Як ви отримуєте доступ до даних запиту?

from flask import request

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

Відповідь на це запитання змусив мене запитати « Get raw body» POST у «Python Flask» незалежно від заголовка «Content-Type» , який стосується отримання необроблених даних, а не проаналізованих даних.

Відповіді:


1265

У документах описують атрибути доступні за запитом. У більшості випадків request.dataвін буде порожнім, оскільки він використовується як резервний:

request.data Містить дані вхідного запиту як рядок у випадку, якщо він був розміщений з міметиком. Колба не обробляє.

  • request.args: пари ключ / значення в рядку запиту URL
  • request.form: пари ключів / значень у тілі, від форми публікації HTML або запиту JavaScript, який не закодований JSON
  • request.files: файли в тілі, від яких Flask зберігається окремо form. Форми HTML повинні використовуватись, enctype=multipart/form-dataабо файли не завантажуватимуться.
  • request.values: комбіновано argsі form, вважаючи argsза краще, якщо ключі перетинаються
  • request.json: проаналізовано дані JSON. Запит повинен мати application/jsonтип вмісту або використовувати його, request.get_json(force=True)щоб ігнорувати тип вмісту.

Все це є MultiDictекземплярами (крім json). Ви можете отримати доступ до значень за допомогою:

  • request.form['name']: використовуйте індексацію, якщо знаєте, що ключ існує
  • request.form.get('name'): використовувати, getякщо ключ може не існувати
  • request.form.getlist('name'): використовувати, getlistякщо ключ надсилається кілька разів, і ви хочете список значень. getповертає лише перше значення.

204

Щоб отримати необроблені дані, використовуйте request.data. Це працює лише в тому випадку, якщо його не вдалося проаналізувати як дані форми, інакше вони будуть порожніми і request.formматимуть дані, що розбираються.

from flask import request
request.data

177

Для параметрів запиту URL використовуйте request.args.

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

Для введення форми використовуйте request.form.

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

Для JSON, розміщеного з типом вмісту application/json, використовуйте request.get_json().

data = request.get_json()

98

Ось приклад розбору опублікованих даних JSON та повторення їх назад.

from flask import Flask, request, jsonify

app = Flask(__name__)

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

Щоб опублікувати JSON з завитком:

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

Або використовувати Поштальона:

використання листоноші для публікації JSON


36

Якщо ви публікуєте JSON з типом вмісту application/json, використовуйте його request.get_json()для отримання у Flask. Якщо тип вмісту невірний, Noneповертається. Якщо дані не JSON, виникає помилка.

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

31

Щоб отримати необроблений текст повідомлення незалежно від типу вмісту, використовуйте request.get_data(). Якщо ви використовуєте request.data, він дзвонить request.get_data(parse_form_data=True), який заповнить request.form MultiDictі залишиться dataпорожнім.


18

Щоб отримати request.formзвичайний словник, використовуйте request.form.to_dict(flat=False).

Щоб повернути JSON дані для API, передайте їх jsonify.

Цей приклад повертає дані форми у вигляді даних JSON.

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

Ось приклад даних форми POST з завитком, повертаючись як JSON:

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

12

Використовуйте request.get_json()для опублікування даних JSON.

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

Використовуйте request.formдля отримання даних під час подання форми методом POST.

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

Використовуйте request.argsдля отримання даних, переданих у рядку запиту URL-адреси, як, наприклад, при подачі форми методом GET.

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

request.formі т. д. є диктантними, використовуйте getметод, щоб отримати значення із замовчуванням, якщо воно не було передано.


10

Щоб розмістити JSON без application/jsonтипу вмісту, використовуйте 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

Сирі дані передаються у програму Flask з сервера WSGI як request.stream. Довжина потоку знаходиться в Content-Lengthзаголовку.

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

Зазвичай це безпечніше використовувати request.get_data().


9

Щоб розмістити JSON з jQuery в JavaScript, використовуйте 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");
    }   
});

Розберіть його в колбі с request.get_json().

data = request.get_json()

8

Для розбору JSON використовуйте request.get_json().

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

5

Ось приклад розміщення даних форми для додавання користувача до бази даних. Перевірте, request.method == "POST"чи була подана форма. Використовуйте клавіші від, request.formщоб отримати дані форми. Візуалізуйте шаблон HTML із <form>іншим способом. Поля у формі повинні мати 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")
<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

Якщо тип вмісту буде розпізнано як дані форми, request.dataбуде розібрано його вrequest.form і поверне порожній рядок.

Щоб отримати необроблені дані незалежно від типу вмісту, зателефонуйте request.get_data(). request.dataдзвінки get_data(parse_form_data=True), тоді як за замовчуванням - Falseякщо ви телефонуєте безпосередньо.


4

Якщо тіло буде розпізнано як дані форми, воно буде в 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
    )

request.argsмістить аргументи, розібрані з рядка запиту, незалежно від того, що було в тілі, тож ви видалили б його, get_request_data()якщо одночасно мають і дані, і тіло.


2

Опублікувавши дані форми за допомогою форми 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>
"""
ImmutableMultiDict([('txt3', 'text 3')])

Тільки txt3вхід мав a name, тому це єдиний ключ, присутній у request.form.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.