Получить данные, полученные в запросе Flask

Я хочу получить данные, отправленные в мое приложение Flask. Я попытался получить доступ к request.data, но это пустая строка. Как вы получаете доступ к данным запроса?

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

Ответ на этот вопрос заставил меня спросить Получить необработанное тело POST в Python Flask независимо от заголовка Content-Type, который заключается в получении необработанных данных, а не проанализированные данные.

Ответ 1

Документы описывают атрибуты, доступные в запросе. В большинстве распространенных случаев request.data будет пустым, потому что он использовался как запасной вариант:

request.data Содержит данные входящего запроса в виде строки на случай, если они пришли с Mimetype, который Flask не обрабатывает.

  • 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 возвращает только первое значение.

Ответ 2

Чтобы получить необработанные данные, используйте request.data. Это работает, только если он не может быть проанализирован как данные формы, иначе он будет пустым и request.form будет иметь проанализированные данные.

from flask import request
request.data

Ответ 3

Для параметров запроса 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()

Ответ 4

Вот пример синтаксического анализа опубликованных данных 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:

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

Или использовать Почтальон:

using postman to post JSON

Ответ 5

Если вы публикуете JSON с типом контента application/json, используйте request.get_json(), чтобы получить его во Flask. Если тип содержимого неправильный, возвращается None. Если данные не в формате JSON, возникает ошибка.

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

Ответ 6

Чтобы получить необработанное тело сообщения независимо от типа содержимого, используйте request.get_data(). Если вы используете request.data, он вызывает request.get_data(parse_form_data=True), который заполнит request.form MultiDict и оставит data пустым.

Ответ 7

Чтобы получить request.form в качестве обычного слова, содержащего все значения для каждого ключа, используйте request.form.to_dict(flat=False). Это может быть полезно для хранения данных с чем-то, что не понимает MultiDict.

Чтобы вернуть данные 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 с curl, который возвращается как JSON:

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

Ответ 8

Чтобы опубликовать 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)

Ответ 9

Необработанные данные передаются в приложение Flask с сервера WSGI как request.stream. Длина потока указана в заголовке Content-Length.

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

Вместо этого обычно безопаснее использовать request.get_data().

Ответ 10

Чтобы проанализировать JSON, используйте request.get_json().

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

Ответ 11

Используйте 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 и т.д. похожи на dict, используйте метод get, чтобы получить значение со значением по умолчанию, если оно не было передано.

Ответ 12

Если тип содержимого распознается как данные формы, request.data проанализирует его в request.form и вернет пустую строку.

Чтобы получить необработанные данные независимо от типа контента, позвоните request.get_data(). request.data вызывает get_data(parse_form_data=True), тогда как по умолчанию используется значение False, если вы вызываете его напрямую.

Ответ 13

Если тело распознается как данные формы, оно будет в 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(), если и оно, и тело должны передавать данные одновременно.

Ответ 14

Чтобы опубликовать 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()

Ответ 15

При публикации данных формы в форме 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 имел name, поэтому он единственный ключ, присутствующий в request.form.

Ответ 16

попробуйте request.arg или иначе, когда вы передаете данные или полезную нагрузку из вызова POST, передайте тип контента как "application/json", чтобы вы могли получить к нему доступ, используя request.json или request.data

Ответ 17

Для тех, кому нужен мой кодовый набор

код app.py

from flask import Flask, render_template, request
from models import db, User

app = Flask(__name__)

POSTGRES = {
 'user': 'postgres',
 'pw': 'silverTip',
 'db': 'flaskmovie',
 'host': 'localhost',
 'port': '5432',
}
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://%(user)s:\
%(pw)[email protected]%(host)s:%(port)s/%(db)s' % POSTGRES
db.init_app(app)

@app.route('/')
def index():
    return render_template('addU.html')

@app.route('/postU', methods=['POST', 'GET'])
def postU():

    if request.form:
        user = User(id=request.form.get("id"), username=request.form.get("username"),email=request.form.get("email"))

        db.session.add(user)
        db.session.commit()
    return render_template('addU.html')

if __name__ == '__main__':
    app.run()

models.py code

from flask_sqlalchemy import SQLAlchemy
import datetime

db = SQLAlchemy()

class BaseModel(db.Model):
    """Base data model for all objects"""
    __abstract__ = True
def __init__(self, *args):
        super().__init__(*args)
def __repr__(self):
        """Define a base way to print models"""
        return '%s(%s)' % (self.__class__.__name__, {
            column: value
            for column, value in self._to_dict().items()
        })
def json(self):
        """
                Define a base way to jsonify models, dealing with datetime objects
        """
        return {
            column: value if not isinstance(value, datetime.date) else value.strftime('%Y-%m-%d')
            for column, value in self._to_dict().items()
        }

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(80), unique=True)

    def __init__(self,id, username, email):
        self.id = id
        self.username = username
        self.email = email

код manage.py

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import app, db
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
    manager.run()

addU.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>

<body>
    <form method="post" action="/postU">
        <label>id:</label>
        <input id="id" type="text" name="id">
        <label>Username:</label>
        <input type="text" name="username">
        <label>Email:</label>
        <input type="text" name="email">
        <input type="submit" />
    </form>

</body>
</html>

enter image description here  Строки кода, приведенные на рисунке, являются строками кода, отвечающими за отправку данных из приложения-колбы в базу данных, в моем случае postgreSQL db

Ответ 18

from flask import Flask, request, jsonify

@app.route('/added', methods=['POST'])
def add():
    data = request.get_json(force=True)
    l = {'name': data['name']}
    lingual.append(l)

    return jsonify({'lang': lingual})