Как получить данные, полученные в запросе Flask
Я хочу иметь возможность получать данные, отправленные в мое приложение колбы. Я пробовал получить доступ request.data
но это пустая строка. Как получить доступ к данным запроса?
@app.route('/', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
ответ на этот вопрос заставил меня спросить получить сырое тело сообщения в колбе Python независимо от заголовка типа контента далее, речь идет о получении необработанных данных, а не проанализированных данных.
14 ответов
на docs опишите атрибуты, доступные в запросе. В большинстве случаев request.data
будет пустым, потому что он используется как запасной вариант:
request.data
содержит данные входящего запроса в виде строки, если он поставляется с колбой mimetype, не обрабатывается.
-
request.args
: пары ключ / значение в строке запроса URL -
request.form
: пары ключ / значение в теле, из формы HTML post или JavaScript запрос, который не JSON, закодированные -
request.files
: файлы в теле, которое фляга держит отдельно отform
. HTML-формы должны использоватьenctype=multipart/form-data
или файлы не будут загружены. -
request.values
: совмещенныйargs
иform
, предпочитаяargs
если ключи пересекаются
все это MultiDict
экземпляров. Вы можете получить доступ к значениям через:
-
request.form['name']
: использовать индексирование, если вы знаете ключ существует -
request.form.get('name')
используйтеget
если ключ не существует -
request.form.getlist('name')
используйтеgetlist
если ключ отправляется несколько раз, и вам нужен список значений.get
возвращает только первое значение.
Это просто следующим образом
на параметр запроса URL используйте запрос.args
search = request.args.get("search")
page = request.args.get("page")
на форма входа используйте запрос.форма
email = request.form.get('email')
password = request.form.get('password')
на тип данных application / json используйте запрос.данные
# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
я приведу полный пример application / json:
from flask import Flask, abort, request
import json
app = Flask(__name__)
@app.route('/foo', methods=['POST'])
def foo():
if not request.json:
abort(400)
print request.json
return json.dumps(request.json)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
использовать почтальон для запроса post:
использовать curl:
curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
С. П. Для примера параметра запроса URL вы можете увидеть мой ответ в несколько параметров в колбе approute
Flask имеет еще один ярлык для JSON:
:{Content-Type: application/json}
@app.route("/something", methods=["POST"])
def do_something():
data = request.get_json()
Если вы хотите, чтобы тело RAW post независимо от типа контента, вы должны использовать request.get_data()
, потому что request.form
превращается в .
проще говоря, вы можете получить данные как ниже:
@app.before_request
def before_request():
g.data = request.get_json() or request.values
теперь g.data
пример werkzeug.ImmutableMultiDict
. Тогда вы можете использовать g.data
, который может обрабатывать большинство ваших требований. Например, вы можете использовать его так:
@app.route("/something", methods=["POST"])
def do_something():
result = handle(g.data)
return jsonify(data=result)
конечно, вы можете использовать blueprint
вместо app
~~
@app.route('/', methods=['POST'])
def process_data():
req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
language = req_data['language'] # or whatever key you have in your json
return '''The language value is: {}'''.format(language)
используя request.form
.
вместо получения данных одной формы (request.form["field_name"]
), вы можете получить все размещенные данные, проанализировав ImmutableDict
предоставлен
в javascript:
var value_data = [1,2,3,4];
$.ajax({
type: 'POST',
url: '/',
data:JSON.stringify(value_data),
success: function (response) {
alert("Data added successfully");
},
});
в python:
client_data = request.get_data()
Если тип mime распознается, то оба request.data
и request.get_data()
возвращает пустые строки.
чтобы получить полное содержимое независимо от того, вам нужно позвонить request.get_data(as_text=True)
.
см.http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data
для таких, как я, кто забыл (немного) о HTML, будьте уверены <input>
в своем <form>
есть name=""
атрибут!
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
print("Posted data : {}".format(request.form))
return """
<form method="post">
<input type="text">
<input type="text" id="idtxt2">
<input type="text" name="txt3" id="idtxt3">
<input type="submit" Value="Hopla!">
</form>
"""
if __name__ == "__main__":
app.run()
результат на консоль :
freezed@machine % python3 run.py
* Serving Flask app "flaskstuff.views" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 268-634-781
127.0.0.1 - - [20/Aug/2018 16:52:59] "POST / HTTP/1.1" 200 -
Posted data : ImmutableMultiDict([('txt3', 'text 3')])
нет атрибут name = нет данных на ImmutableMultiDict([])
!
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})