DRF Flashcards

1
Q

API

A

API (от англ. Application Programming Interface, «программный интерфейс приложения») — это интерфейс для обмена данными. Слово «программный» означает, что API служат в первую очередь для взаимодействия программ: с системой взаимодействует не разработчик, а код, написанный им.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

JSON

A

Текстовый формат обмена данными, основанный на JavaScript. JavaScript Object Notation (англ. «объектная запись JavaScript»). Исторически сложилось так, что этот формат «вырос» из языка программирования JavaScript. По структуре JSON очень похож на тип данных dict: это последовательность пар «ключ-значение»; как и словари, JSON поддерживает вложенность. Но JSON более стандартизирован: например, ключи словаря в JSON пишутся только в двойных кавычках. Значениями ключей могут быть строки, числа, булевы значения, словари и списки.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

XML

A

JSON — популярный, но не единственный формат для передачи данных.
XML (eXtensible Markup Language, «расширяемый язык разметки») тоже весьма популярен и широко применяется в разработке. Внешне этот язык чем-то похож на HTML, и это неслучайно: язык разметки веб-страниц — прямой потомок XML.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Архитектура REST

A

REST (англ. REpresentational State Transfer, «передача состояния представления») — это архитектурный стиль, набор принципов взаимодействия компьютерных систем, основанный на методах протокола HTTP. В отличие от SOAP, REST не подкреплен официальным стандартом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

REST

A

REpresentational State Transfer, REST (англ. «передача состояния представления») — это набор принципов, которых следует придерживаться при создании API. Если API сделан по этим принципам, его называют RESTful API (или просто REST API).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Принципы REST #1

A
  1. Клиент-сервер. Разделение ответственности между клиентом и сервером
    Клиент и сервер отвечают за разные вещи. Ответственность клиента — пользовательский интерфейс, ответственность сервера — данные. Если API возвращает HTML-страницу, его нельзя назвать REST API: ведь при этом сервер берёт на себя ответственность за интерфейс.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Принципы REST #2

A
  1. Отсутствие состояния. Сервер не хранит состояние
    Каждый запрос должен быть независимым, как будто он сделан в первый раз. Сервер не должен хранить какой-либо информации о клиенте. Каждый запрос клиента к серверу должен содержать всю информацию, необходимую для обработки этого запроса: кто запрашивает данные, какие данные запрашиваются.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Принципы REST #3

A
  1. Единый интерфейс
    Интерфейс обращения к серверу одинаков для всех и не зависит от клиента. Запрос к данным может быть сформирован из браузера, мобильного приложения и с «умного» чайника по одним и тем же правилам.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Принципы REST #4

A
  1. Многоуровневость
    Первый принцип гласит, что в коммуникации участвуют двое: клиент и сервер. Но можно строить более сложные системы, не нарушая этого принципа.
    API сервиса Яндекс.Такси может использовать API Яндекс.Навигатора. Вы как клиент взаимодействуете только с API Яндекс.Такси, а он, в свою очередь, является клиентом навигатора. Здесь есть одно условие — каждый компонент должен видеть только свой уровень. Например, Яндекс.Навигатор не должен видеть все данные, которые вы отправили в Яндекс.Такси.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Принципы REST #5

A
  1. Кешируемость
    Данные ответа могут быть закешированы. Это значит, что можно сохранить полученные данные на клиенте, а при идентичном запросе взять их из памяти клиента — кеша, а не ждать их с сервера. Нет смысла запрашивать данные повторно, если они никак не изменились.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Принципы REST #6

A
  1. Код по запросу
    Этот принцип необязательный. Он гласит, что функциональность клиента может быть расширена кодом, приходящим с сервера. Сейчас такое можно встретить повсеместно: JavaScript используется для «оживления» страниц и исполнения каких-то сценариев на стороне клиента. Но принципы формулировались в 2000 году — тогда исполняемый код с сервера возвращали не так часто. Потому и выделили это в отдельный принцип.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Ключевая абстракция в REST

A

Ключевая абстракция в REST это ресурс. Любая информация, которая может быть названа, может быть ресурсом: пост в социальной сети, коллекция постов, подборка актуальных новостей, пользователь сайта, коллекция любых объектов или других ресурсов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

эндпоинт

A

В терминах REST URL-адрес, идентифицирующий ресурс, принято называть эндпоинтом (англ. endpoint, «конечная точка»).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

HTTP-методы

A

Любой API предназначен для получения доступа к ресурсам. К ресурсу всегда можно обратиться по URL.
HTTP-метод запроса определяет, что следует сделать:

GET получает ресурсы;
POST создаёт ресурс;
PUT заменяет существующий ресурс целиком;
PATCH частично изменяет существующий ресурс;
DELETE удаляет ресурс.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Идемпотентность методов

A

Идемпотентность (от лат. idem — «тот же самый» и potens — «способный») — это свойство, заключающееся в том, что многократное выполнение этого метода по результату равно однократному. То есть, выполняя один и тот же запрос много-много раз, мы всегда будем получать один и тот же результат. Даже если сто раз отправить GET-запрос на получение никнейма конкретного пользователя, ответ не изменится

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Безопасность методов

A

Безопасность: метод, который не изменяет ресурс, называется безопасным. Например, если в качестве ресурса рассматривать никнеймы пользователей, то сколько ни отправляй GET-запрос на получение никнейма конкретного пользователя — к изменению никнейма это не приведёт. Метод GET — безопасный.
Метод, который может изменить ресурс, в терминах архитектуры REST считается небезопасным. Такими методами могут быть PUT, PATCH, DELETE или POST.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Авторизация

A

Авторизация (англ. authorization, «разрешение, одобрение») — предоставление пользователю прав на выполнение каких-то действий

18
Q

Аутентификация

A

Аутентификация (англ. authentication, «опознание») — процедура проверки подлинности пользователя

19
Q

OAuth (Open Authorization)

A

OAuth (Open Authorization) — это схема авторизации, предоставляющая третьей стороне (другому пользователю или приложению) ограниченный доступ к ресурсам сервиса от вашего имени, без необходимости передавать логин и пароль. Это становится возможным благодаря OAuth-токену.

20
Q

Токен

A

Токен (англ. “token” – опознавательный знак, жетон) — это уникальная строка из цифр и латинских букв, он может выглядеть так:
854234bfefcf1f000d92df5e4c5e8858b9ebcb4821e12cd806add07e17f587c4c93e3b50d5adbdae2b2

21
Q

Django REST Framework

A

Это библиотека которая ускорит и упростит разработку REST API.
Django REST Framework (DRF) предоставляет разработчику весь необходимый набор инструментов для создания REST-сервисов на основе Django. По сути, DRF — это коллекция предустановленных классов. DRF даёт инструменты для решения штатных задач, возникающих при создании REST API.

22
Q

Принцип проектирования API - Консистентность

A

Консистентность — это согласованность данных друг с другом, их целостность и внутренняя непротиворечивость. Например, данные о каком-то объекте, полученные с одного эндпоинта, не должны отличаться от данных о том же объекте, но полученных с другого эндпоинта.
Пример с полем date и его форматом для энда пост и для энда коммент

23
Q

Принцип проектирования API - Согласованность

A

Понятие консистентности включает в себя и идею согласованности: добавление в API новой функциональности не должно сломать API.

24
Q

Принцип проектирования API - Расширяемость

A

Пример с отдачей данных не в виде упорядоченного списка: [[1, “Это мой первый комментарий.”, 1618565516, 10]] Так иногда делают для повышения производительности, но в нашей ситуации этот вариант оказался непрактичен: он усложняет расширяемость. Здесь лучше отдавать данные в более распространённом для JSON формате, аналогичном словарю, со структурой {“ключ”: “значение”}.
При такой структуре добавление новых элементов не повлечёт за собой проблем с парсингом данных. Клиенты будут получать необходимую информацию из ответа по прежним ключам, а новые ключи могут использовать, а могут игнорировать. И ничего не сломается.

25
Q

Инструментарий для тестирования API

A

Такие программы можно условно разделить на консольные (такие как curl и httpie), встраиваемые (плагины для браузера или для редактора кода, например, REST Client для VS Code) и графические (Postman).

26
Q

Сериализаторы - что такое?

A

Сериализаторы преобразуют сложные данные, такие как queryset или экземпляр модели, в простые типы данных Python, которые затем можно конвертировать («отрендерить») в JSON, XML или другие форматы обмена.

Сериализаторы выполняют и обратное преобразование: конвертируют данные, полученные из JSON, в сложные объекты; при этом данные проходят валидацию.

27
Q

class Serializer

A

Для работы с обычными Python-классами сериализаторы наследуют от класса Serializer.

28
Q

SerializerMethodField

A

~~~

```SerializerMethodField — это поле для чтения, связанное с определённым методом, в котором будет вычислено значение этого поля. Метод, который будет вызван для поля <имя_поля>, по умолчанию должен называться get_<имя_поля>.</имя_поля></имя_поля>

С помощью поля SerializerMethodField можно модифицировать существующее поле или создать новое.
Добавьте в сериализатор CatSerializer поле age (его нет в модели Cat); содержимое этого поля будет вычисляться «на лету» в методе get_age:

import datetime as dt

class CatSerializer(serializers.ModelSerializer):
achievements = AchievementSerializer(many=True)
age = serializers.SerializerMethodField()

class Meta:
    model = Cat
    fields = ('id', 'name', 'color', 'birth_year', 'owner', 'achievements',
              'age')

def get_age(self, obj):
    return dt.datetime.now().year - obj.birth_year
29
Q

Обработка запросов к API

A

Для обработки запросов к API могут использоваться представления как в виде функций, так и в виде классов. Функции, как правило, позволяют лучше понять как работает код; вот с них и начнём.
1. View-функции API
2. View-классы API
3. Viewset

30
Q

View-функции API

A

Для «настройки» view-функции на работу с API в Django REST framework есть декоратор @api_view. В качестве аргумента декоратору передают список типов HTTP-запросов, которые должна обрабатывать эта функция:
~~~
api_view([‘GET’, ‘POST’]) # Разрешены только POST- и GET-запросы
def cat_list(request):
# В случае POST-запроса добавим список записей в БД
if request.method == ‘POST’:
serializer = CatSerializer(data=request.data, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# В случае GET-запроса возвращаем список всех котиков
cats = Cat.objects.all()
serializer = CatSerializer(cats, many=True)
return Response(serializer.data)
~~~

31
Q

Отличие view-функции API в Django REST framework состоит в том…..

A

…что они возвращают специальный объект класса Response; в этот объект в качестве аргумента передаётся Python-словарь, данные из которого и должны быть отправлены в ответ на запрос в JSON формате.

32
Q

Данные в запросе приходят в формате JSON….

A

….преобразуются в Python-словарь, доступ к которому можно получить через объект request.data. Этот словарь и передаётся в сериализатор через именованный параметр data.
~~~
@api_view([‘GET’, ‘POST’])
def cat_list(request):
# Обработчик для POST-запросов.
if request.method == ‘POST’:
serializer = CatSerializer(data=request.data)
~~~

33
Q

View-классы API (как следующий этап работы с Views в DRF после view-функций)

A

Встроенные классы DRF можно условно разделить на низкоуровневые и высокоуровневые. Низкоуровневые содержат лишь базовую структуру класса, его скелет; разработчик сам должен описать работу класса; их применяют для решения нестандартных задач.
Типовые задачи (скажем, CRUD) удобнее решать с помощью высокоуровневых view-классов: в них уже заготовлены все инструменты для решения стандартных задач.

34
Q

Низкоуровневые view-классы в DRF - APIView

A

view-класс APIView импортируется из модуля rest_framework.views
~~~
class MyAPIView(APIView):
def get(self, request):

def post(self, request):
    ...

def put(self, request):
    ...

def patch(self, request):
    ...

def delete(self, request):
    ...  ~~~
35
Q

Generic Views: высокоуровневые view-классы

A

В дженериках задают всего два поля: queryset (набор записей, который будет обрабатываться в классе) и serializer_class (сериализатор, который будет преобразовывать объекты в формат JSON). В DRF все Generic Views объединены в модуле rest_framework.generics.

# Обновлённый views.py
from rest_framework import generics

from .models import Cat
from .serializers import CatSerializer

class CatList(generics.ListCreateAPIView):
    queryset = Cat.objects.all()
    serializer_class = CatSerializer

class CatDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Cat.objects.all()
    serializer_class = CatSerializer
36
Q

Generic Views все классы

A

GENERICS
CreateAPIView
DestroyAPIView
GenericAPIView
ListAPIView
ListCreateAPIView
RetrieveAPIView
RetrieveDestroyAPIView
RetrieveUpdateAPIView
RetrieveUpdateDestroyAPIView
UpdateAPIView

37
Q

Viewset: после view-функций и view-классов

A

Вьюсет (англ. viewset, «набор представлений») — это высокоуровневый view-класс, реализующий все операции CRUD; он может вернуть объект или список объектов, создать, изменить или удалить объекты.

они хранятся в пакете rest_framework.viewsets

38
Q

Viewset - ModelViewSet

A

Класс ModelViewSet может выполнять любые операции CRUD с моделью. От разработчика не требуется описывать методы для чтения и записи данных для модели: эти операции уже реализованы.
В классе, наследующемся от ModelViewSet, обязательно должны быть описаны два поля:
1. в поле queryset задаётся выборка объектов модели, с которой будет работать вьюсет;
2. в поле serializer_class указывается, какой сериализатор будет применён для валидации и сериализации.

from rest_framework import viewsets 

from .models import Cat
from .serializers import CatSerializer

class CatViewSet(viewsets.ModelViewSet):
    queryset = Cat.objects.all()
    serializer_class = CatSerializer 
39
Q

Viewset - ReadOnlyModelViewSet

A

В пакете rest_framework.viewsets есть похожий на ModelViewSet, но ограниченный в правах класс ReadOnlyModelViewSet. Он может только получать данные модели, а записывать и изменять — не может.
Этот класс полезен в ситуациях, когда требуется только выдавать данные по запросу, без возможности их изменить. В остальном ReadOnlyModelViewSet работает точно так же, как и ModelViewSet.

40
Q

Роутеры

A

С помощью роутера для заданных вьюсетов создаются эндпоинты по маске адреса:
~~~
URL-префикс/
URL-префикс/<int:pk>.
~~~
В DRF есть два стандартных роутера: SimpleRouter и DefaultRouter.</int:pk>

41
Q

SimpleRouter

A

urls.py

В файл urls.py импортируйте класс SimpleRouter и создайте экземпляр этого класса.
~~~
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
~~~
router.register('cats', CatViewSet)
После регистрации надо включить новые эндпоинты в список urlpatterns: перечень эндпоинтов будет доступен в router.urls.

42
Q

DefaultRouter

A

DefaultRouter — это расширенная версия SimpleRouter: он умеет всё то же, что и SimpleRouter, а в дополнение ко всему генерирует корневой эндпоинт /, GET-запрос к которому вернёт список ссылок на все ресурсы, доcтупные в API.