Запрос на фляжку и тип приложения/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.
Ответы
Ответ 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