Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Обзор и сравнение методов реализации REST API в django

Обзор и сравнение методов реализации REST API в django

Посмотрим на различные библиотеки и способы реализации API, постараемся их сравнить.

Moscow Python Meetup

June 24, 2015
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Как? REST(Representational State Transfer) • Клиент-серверная архитектура. • Сервер не

    обязан сохранять информацию о состоянии клиента. • В каждом запросе клиента должно явно содержаться указание о возможности кэширования ответа и получения ответа из существующего кэша. • Клиент может взаимодействовать не напрямую с сервером, а с произвольным количеством промежуточных узлов. • Унифицированный программный интерфейс сервера. URI в качестве запросов к серверу. Ответы в JSON, XML.
  2. class ApiDetailView(View): def get(self, request, *args, **kwargs): serialized_data = CustomSerializer().serialize([obj])

    return JsonResponse(data=serialized_data[0], safe=False) def delete(self, request, *args, **kwargs): def put(self, request, *args, **kwargs): if form.is_valid(): class ApiListView(View): def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs): if form.is_valid(): Django
  3. class ApiDetailView(View): def get(self, request, *args, **kwargs): serialized_data = CustomSerializer().serialize([obj])

    return JsonResponse(data=serialized_data[0], safe=False) def delete(self, request, *args, **kwargs): def put(self, request, *args, **kwargs): if form.is_valid(): class ApiListView(View): def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs): if form.is_valid(): Django Один ресурс, но два класса с дублируемой логикой
  4. class EntryListApiView(ApiListView): model = Entry form = EntryForm class EntryDetailApiView(ApiDetailView):

    model = Entry form = EntryForm url(r'entry/$', EntryListApiView.as_view()), url(r'entry/(?P<pk>\d+)/$', EntryDetailApiView.as_view()),
  5. class EntryListApiView(ApiListView): model = Entry form = EntryForm class EntryDetailApiView(ApiDetailView):

    model = Entry form = EntryForm url(r'entry/$', EntryListApiView.as_view()), url(r'entry/(?P<pk>\d+)/$', EntryDetailApiView.as_view()), Дублирование Один ресурс два патерна
  6. • сериализация/десериализация • доступные методы(GET, POST) • работа со связями

    • регистрация патернов для ссылок • гибкость и расширяемость • валидация • фильтрация • ... Нужна архитектура но это сложно
  7. обновления django 1.8 python3 версия tastypie 04.2015 1.5+ 0.12.1* django-rest-framework

    06.2015 1.4.2+ 3.1.2 restless 06.2015 1.5+ 2.0.1 django-nap 05.2015 1.4-1.7 0.14.4
  8. API CRUD для class Entry(models.Model): user = models.ForeignKey(User) title =

    models.CharField(max_length=400) created_date = models.DateTimeField (auto_now_add=True) content = models.TextField()
  9. class EntryResource(ModelResource): user = fields.ForeignKey(UserResource, 'user') class Meta: queryset =

    Entry.objects.all() resource_name = 'entry' authorization = Authorization() validation = EntryValidator(form_class=EntryForm) api_urls = EntryResource().urls
  10. class EntrySerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Entry class EntryViewSet(viewsets.ModelViewSet): queryset

    = Entry.objects.all() serializer_class = EntrySerializer router = routers.DefaultRouter() router.register(r'entry', EntryViewSet)
  11. Плюсы • framework • модульная архитектура • веб просмотр •

    хорошая документация • много сторонних библиотек • хорошая валидация • активно развивается • хороший код
  12. TastyPie и RestFramework • генерируют API из моделей • генерируют

    паттерны для ссылок • не только Django Model • пагинация • авторизация • аутентификация • кэширование • ограничение запросов(Throttling) • фильтрация • JSON, JSONP, XML, YAML Плотность и Вложенность
  13. Restless https://github.com/toastdriven/restless/ class MyList(ListEndpoint): model = Entry class MyDetail(DetailEndpoint): model

    = Entry url(r'entry/$', MyList.as_view(), name='entry-list-restless'), url(r'entry/(?P<pk>\d+)/$', MyDetail.as_view(), name='entry-detail-restless'),
  14. Плюсы • хорошая документация • простой • придерживается философии •

    Django, Flask, Pyramid & Itty • есть пакет для Django • валидация • интересный сериализатор
  15. serialize(author, include=[ ('books', dict( # поля для каждой книги fields=[

    'title', 'isbn', ('reviews', dict()) # получить список всех reviews ] )), ('average_rating', # добавление поля lambda a: a.books.all().aggregate(Avg('rating'))['avg_rating']) ])
  16. Django-nap class EntrySerialiser(serialiser.ModelSerialiser): def object_inflate(self, data, instance=None, **kwargs): def deflate_user(self,

    obj, data, **kwargs): def inflate_user(self, data, obj, instance, **kwargs): class Meta: model = Entry class EntryPublisher(ObjectDeleteMixin, rest.ModelPublisher): api_name = 'entry' serialiser = EntrySerialiser() def object_delete_default(self, request, object_id, **kwargs): def object_put_default(self, request, object_id, **kwargs): https://github.com/funkybob/django-nap/
  17. Спасибо команде DjangoMoscowMeetup: Илья Барышев Григорий Петров Владимир Филонов Валентин

    Домбровский письма [email protected] pull request https://github.com/overmesgit/django_rest_api_comparison Заключение