Как получить данные, полученные в запросе колбы
Я хочу, чтобы иметь возможность получить данные, отправленные в мою колбу приложение. Я пытался получить доступ request.data но это пустая строка. Как получить доступ к данным запроса?
@app.route('/', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
ответ на этот вопрос заставил меня спросить Get raw POST body в Python Flask независимо от заголовка Content-Type next, который касается получения необработанных данных, а не проанализированных данных.
14 ответов:
The docs опишите атрибуты, доступные в запросе. В большинстве случаев
request.dataбудет пустым, потому что он используется как запасной вариант:
request.dataсодержит данные входящего запроса в виде строки в случае, если он пришел с колбой mimetype не обрабатывает.
request.args: пары ключ / значение в строке запроса URLrequest.form: пары ключ / значение в теле, из формы HTML post или JavaScript запрос, который не закодирован в JSONrequest.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-запроса используйте запрос.аргументы
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)использовать почтальон на пост запрос:
использовать curl:
curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/fooС. П. Для примера параметра URL-запроса вы можете увидеть мой ответ в несколько параметров в колбе approute
колба имеет еще один ярлык для JSON:
:{Content-Type: application/json} @app.route("/something", methods=["POST"]) def do_something(): data = request.get_json()
Если вы хотите необработанное тело сообщения независимо от типа контента, вы должны использовать
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})

Comments