Python-flask извлекает значения из POST-запроса в REST API

Я пытаюсь извлечь значения из полезной нагрузки JSON по запросу POST:

Вопрос 1. Как лучше всего получить данные?

Первый способ?

@app.route('/login', methods=['POST'])
def login():
    if request.method == 'POST':
        test = request.data
        return test

или второй способ?

@app.route('/login', methods=['POST'])
def login():
    if request.method == 'POST':
        test = json.loads(request.json)
        return test

Вопрос 2. Как получить конкретное значение?

Учитывая полезную нагрузку json:

{ "test": "hello world" }

Я попытался сделать код ниже, но не работает.

#way1
return request.data["test"]

#error message: TypeError: string indices must be integers, not str

#way2
test["test"]

#error message: TypeError: expected string or buffer

person edmamerto    schedule 25.06.2017    source источник
comment
не работает, мало что нам говорит. Как это не работает? Вы получаете неверный результат? Совсем нет результата? Сообщение об ошибке?   -  person John Gordon    schedule 25.06.2017
comment
попробуй test = request.get_json(force=True)   -  person abigperson    schedule 25.06.2017
comment
@PJSantoro Так что я бы сделал это по-твоему, но как мне выбрать конкретное значение, учитывая json {test:test}, скажем, я хочу получить значение test   -  person edmamerto    schedule 25.06.2017
comment
Ваш пост еще не ясен. Когда именно вы получаете TypeError: expected string or buffer? Это происходит при вызове json.loads(), или когда вы делаете test["test"], или где-то еще?   -  person John Gordon    schedule 25.06.2017
comment
Это не мой способ, это способ, который рекомендует Flask API   -  person abigperson    schedule 26.06.2017


Ответы (1)


Если вы отправляете JSON в конечную точку фляги, вы должны использовать:

request.get_json()

Очень важное замечание по API:

По умолчанию эта функция вернет None, если тип mimetype не является application/json, но это можно переопределить с помощью параметра force.

Это означает... либо убедитесь, что mimetype POST - application/json ИЛИ, обязательно установите для параметра force значение true

Хороший дизайн оставил бы это позади:

request.is_json нравится это:

@app.route('/post/', methods=['POST'])
def post():
    if request.is_json:
        data = request.get_json()
        return jsonify(data)
    else:
        return jsonify(status="Request was not JSON")
person abigperson    schedule 25.06.2017
comment
так как мне извлечь конкретное значение (вопрос 2) - person edmamerto; 25.06.2017
comment
JSON представляет собой комбинацию вложенных словарей и списков Python, поэтому data["test"] даст вам тестовый ключ, если основной JSON, переданный в конечную точку, имел тестовый ключ. - person abigperson; 26.06.2017