Когда бы мне использовать внешний сериализатор, такой как зефир, вместо встроенной в JSON сериализации JSON (from_json и to_json)? - PullRequest
0 голосов
/ 03 октября 2018

Я пишу простой REST API в Python, используя Flask-RESTful и их документация говорит , что они планируют отказаться от своей сериализации объектов (reqparse) в пользу сериализаторов, таких как marshmallow Мой API читает и пишет из хранилища документов MongoDB, используя Flask MongoEngine .

Я был бы очень признателен за пример использования, в котором я бы выбралиспользуйте внешний сериализатор, например Marshmallow, над встроенными сериализаторами MongoEngine для объекта Document.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Существенным отличием является то, что зефир проверяет .

Вы не просто берете какие-либо данные из Интернета и помещаете их в свою базу данных.Проверка предотвращает ввод неправильных данных (злонамеренных или ошибочных).Даже если данные поступают от доверенного пользователя, рекомендуется проверить их, чтобы обеспечить целостность базы данных.

Marshmallow, как flask-restplus, предоставляет средства проверки, которые проверяют не только типы, но и значения (мин / макс)для чисел, мин / макс длина для строк, мин / макс для дат и т. д., вы даже можете создавать свои собственные валидаторы).

Кроме того, API не всегда является CRUD.Между API и БД может быть некоторый бизнес-код, для которого было бы неплохо иметь объекты Python.Парсер Mongo BSON этого не сделает.

MongoEngine обеспечивает проверку, но это происходит непосредственно перед БД, в то время как проверка должна происходить при входе в API.


Кстати, внутренняя [de |] Сериализация в flask-restful уже давно намечена для устаревания, и все кажется застопорившимся ( GH issue # 9 ).Я думаю, что есть люди, использующие колбу-restplus + зефир, так что это может быть путь.

Вот альтернатива:

  • Использовать Marshmallow для сериализации ввода / вывода [10] *
  • Использовать marshmallow-mongoengine , чтобы создать свой зефирСхемы API как можно более автоматически из ваших схем MongoEngine
  • Используйте webargs для анализа аргументов (вставьте аргументы запроса колбы в схемы зефира)
  • Используйте apispec для документирования спецификации, соответствующей стандарту OpenAPI
  • Чтобы упростить задачу, используйте flask-rest-api или flask-apispec , чтобы скрыть слои webargs / apispec и предоставитьхороший интерфейс.

Эта комбинация библиотек не такая зрелая и представлена ​​как монолитная колба-рестплюс, но использование зефира приятно, потому что это отличная библиотека и благодаря предоставленной DRY ness.от marshmallow-mongoengine.


µMongo - это альтернатива MongoEngine, основанная на зефире, поэтому она похожа на MongoEngine с включенным зефиром-mongoengine.

В документации имеется схема, иллюстрирующая различные этапы проверки: API между клиентом и бизнес-объектами и ODM между объектами и БД.


(Отказ от ответственности:зефир, webargs, apispec и фляга-rest-api сопровождающий, µmongo, mongoengine и flask-mongoengine участник.)

0 голосов
/ 03 октября 2018

Mongo использует BSON, и у них есть выделенный анализатор , реализованный на python.
Из источника:

Десериализация:

from bson.json_util import loads
loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]')

# >>> [{u'foo': [1, 2]}, {u'bar': {u'hello': u'world'}}, {u'code': Code('function x() { return 1; }', {})}, {u'bin': Binary('...', 128)}]

Сериализация:

from bson import Binary, Code
from bson.json_util import dumps
dumps([{'foo': [1, 2]},
       {'bar': {'hello': 'world'}},
       {'code': Code("function x() { return 1; }", {})},
       {'bin': Binary(b"")}])

# >>> '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]'

Когда объект, который вы пытаетесь сериализовать / десериализовать, является BSON, вам нужно использовать dumps и loads Монго, иначе он не будет проанализирован правильно.Когда это обычный JSON, вы можете использовать любой, который вам нравится.

...