Flask, REST, validation
Yehor Nazarkin
twitter.com/nimnull
github.com/nimnull
Требования
• Что в основе?
• Что хотим получить?
• Как будем расширять?
• Где храним данные?
REST
• хорошо подходит для web сервисов
• ресурсо-ориентированный
• отсутствие состояния (в декларации)
Потребности
• представление:
players/ — GET (read many), POST (create one)
players/1 — GET (read one), PUT (update one), DELETE (delete one)
Потребности
• фильтрация/сортировки данных:
players/?filter=joined_at__gte%3D1429821631
players/?
order_fields=nickname,joined_at&order_dir=asc
Потребности
• валидация клиентского ввода
• поддержка нескольких хранилищ
• сущности по агрегированным данным
• аутентификация (cookies, basic http, token-based)
• авторизация (группы, пользователи)
• доступ групп клиентов к разным наборам атрибутов
Варианты решения
• Пишем своё
• Берем готовое решение и допиливаем
Django?
• django-tastypie
• django-rest-framework
• django-pyston
• etc
Django?
• Известные проблемы
расширяемости
• Not Invented Here
• Эволюция проекта часто влечет
отказ от поставляемых решений
Flask?
• микро-фреймворк
• основан на werkzeug & jinja2
• большое количество расширений
• На почитать — http://flask.pocoo.org
Flask?
• гибкость
• простота (относительная)
• расширяемость
Что уже есть?
• eve
• flask-restful
• flask-restless
• potion
Если пилим сами
• MethodView FTW!
• flask.ext….anything
Если пилим сами
Как проверять?
• Imperative
• Declarative
• Mixed?
Где проверять
• Данные от пользователей
• Отправка/обработка результатов
внешних сервисов
• Схема данных хранилища
Note:
ORM и подобные предлагают
собственные решения
Как проверять?
Как проверять?
формы (Django/WTF/etc)
Как проверять?
• Gladiator (py3)
• Cerberus (py3)
• Schemer
• kanone
• trafaret
Как проверять?
Как проверять?
Как проверять?
Другие проблемы?
Вопросы?
Links:
• Nested resources — https://github.com/alanjds/drf-nested-routers
• Gladiator — https://github.com/alanjds/drf-nested-routers
• Schemer — https://github.com/gamechanger/schemer
• Trafaret — https://github.com/deepwalker/trafaret

Flask, rest and data