Получить данные, полученные в запросе 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>
Строки кода, приведенные на рисунке, являются строками кода, отвечающими за отправку данных из приложения-колбы в базу данных, в моем случае 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})