Получить JSON из запроса Flask, только если он действителен - PullRequest
0 голосов
/ 03 ноября 2019

Я знаю, что есть хорошие модули (например, validator-collection ), которые могут проверять допустимость JSON. Но в моем случае я хочу добиться этого с помощью встроенных Flask возможностей: is_json() и get_json().

Вот что я пробовал:

import flask

def get_json_data():
    if flask.request.is_json():
        try:
           data = flask.request.get_json()
        except(ValueError):
            # get_json failed, return None
            # handle ValueError
    else:
        # is_json failed, return None
        # handle ValueError

Прочитав документы, я обнаружил только исключение ValueError. Если это действительно единственное исключение, верно ли мой подход, приведенный выше, в его обработке и обеспечении того, чтобы data содержал данные JSON только тогда, когда был сделан действительный запрос JSON?

1 Ответ

0 голосов
/ 03 ноября 2019

Документация гласит, что .is_json() проверяет только, имеет ли запрос Content-Type, что указывает на то, что запрос содержит данные JSON.

свойство is_json
Проверьте, указывают ли mimetype данные JSON, либо application / json или application / +json *.

не проверяет, действительно ли данные запроса являются JSON, поэтому полезность этой проверки ограничена. Когда клиент отправляет JSON, но не устанавливает соответствующий заголовок Content-Type или устанавливает заголовок, но отправляет недействительный JSON, вы ничего не узнаете из .is_json().


Однако .get_json() выполняет проверку «содержит действительный JSON»: он пытается проанализировать данные запроса как JSON, и это либо работает, в этом случае он возвращает данные, либо завершается ошибкой, и в этом случае выдает ошибку. По умолчанию .get_json() внутренне вызывает .is_json() в любом случае.

Для того, что вы хотите сделать, я бы сказал, что этого достаточно.

def get_json_data():
    data = flask.request.get_json()

Если синтаксический анализ не выполнен, нетвыдана ошибка (сравните werkzeug docs ). Вместо этого «Bad Request» возвращается клиенту. Если вы хотите изменить это поведение, переопределите метод Request.on_json_loading_failed() своей собственной версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...