Подтвердить что ты не робот

Запрос на фляжку и тип приложения/json

У меня есть флеш-приложение со следующим представлением:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.json)

Однако это работает только в том случае, если для типа содержимого запроса установлено значение application/json, в противном случае dict request.json - None.

Я знаю, что request.data имеет тело запроса как строку, но я не хочу анализировать его на dict каждый раз, когда клиент забывает установить тип содержимого запроса.

Можно ли предположить, что каждый тип содержимого входящего запроса application/json? Все, что я хочу, - это всегда иметь доступ к допустимому request.json dict, даже если клиент забывает установить тип содержимого приложения в json.

4b9b3361

Ответ 1

По Flask 0.10, вы можете использовать request.get_json() и установите force в True:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

Из документации:

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

Параметры:

  • force - если установлено значение True, то mimetype игнорируется.

Для более старых версий, если вы хотите прощать и разрешать JSON, всегда, вы можете сделать декодирование самостоятельно, явно:

import json

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(json.loads(request.data))

Ответ 2

объект request уже имеет метод get_json, который может предоставить вам json независимо от типа содержимого, если вы выполните его с помощью force=True, чтобы ваш код выглядел примерно так:

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

на самом деле, в документации на флягу указано, что request.get_json следует использовать вместо request.json: http://flask.pocoo.org/docs/api/?highlight=json#flask.Request.json