обязан сохранять информацию о состоянии клиента. • В каждом запросе клиента должно явно содержаться указание о возможности кэширования ответа и получения ответа из существующего кэша. • Клиент может взаимодействовать не напрямую с сервером, а с произвольным количеством промежуточных узлов. • Унифицированный программный интерфейс сервера. URI в качестве запросов к серверу. Ответы в JSON, XML.
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 Один ресурс, но два класса с дублируемой логикой
model = Entry form = EntryForm url(r'entry/$', EntryListApiView.as_view()), url(r'entry/(?P<pk>\d+)/$', EntryDetailApiView.as_view()), Дублирование Один ресурс два патерна
паттерны для ссылок • не только Django Model • пагинация • авторизация • аутентификация • кэширование • ограничение запросов(Throttling) • фильтрация • JSON, JSONP, XML, YAML Плотность и Вложенность
'title', 'isbn', ('reviews', dict()) # получить список всех reviews ] )), ('average_rating', # добавление поля lambda a: a.books.all().aggregate(Avg('rating'))['avg_rating']) ])