В части 3 мы используем Django REST Framework для создания нашего books API. books API имеет сериализаторы, представления и URL-адреса, которые запрашивают, структурируют и доставляют данные книги из базы данных в конечные точки API.

P1, P2, P3, P4, P5

3.1 Django REST Framework

Django REST Framework (DRF) строится поверх Django и используется для создания RESTful Web API. Он предоставляет инструменты, упрощающие процесс. Например, мы будем использовать встроенные сериализаторы и представления вместо того, чтобы создавать их с нуля.

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

3.1.1 Установите Django REST Framework

Убедитесь, что вы находитесь в каталоге my_library и у вас активирована виртуальная среда. Чтобы начать работу с DRF, установите его с помощью pip:

# install Django REST Framework
  pip install djangorestframework

# install Markdown support for the browsable API
  pip install markdown

Теперь откройте my_library/server/server/settings.py и установите DRF прямо над приложением book.

INSTALLED_APPS = [
  ...
  'rest_framework',
  'books'
]

Добавьте настройки по умолчанию внизу файла:

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': [      
   'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
  ]
}

Это класс разрешений, который позволяет неаутентифицированным пользователям иметь доступ только для чтения к API. Узнайте больше о разрешениях здесь.

3.2 API книг

3.2.1 Создание папки API книг

Установив DRF, приступим к созданию books API. Создайте новую папку с именем api внутри приложения books с пустым __init__.py файлом: my_library/server/books/api/__init__.py.

Этот пустой файл помогает Python понять, что эта папка является модулем Python. Папка api будет содержать сериализаторы, представления и URL-адреса для данных наших книг.

3.2.2 Создание сериализатора

Проще говоря, сериализаторы берут данные из базы данных и реструктурируют их для более простой и эффективной работы с более высокими уровнями нашего приложения, такими как интерфейс. Например, интерфейс Ember, который мы создадим, ожидает, что данные, возвращаемые ему из запроса, будут в формате JSON.

Создайте сериализатор в my_library/server/books/api/serializers.py:

from rest_framework import serializers
from books.models import Book
class bookSerializer(serializers.ModelSerializer):
  class Meta:
    model = Book
    fields = (
      'id',
      'title',
      'author',
      'description',
    )

Этот сериализатор принимает данные и преобразует их в формат JSON, чтобы они были понятны веб-интерфейсу.

Импорт
Мы импортируем встроенный serializers из DRF и модель Book из нашего books приложения.

Класс bookSerializer
Для этого проекта нам нужен класс Serializer, который «соответствует полям модели». Мы легко можем сделать это с ModelSerializer. По документации:

Класс ModelSerializer такой же, как обычный класс Serializer, за исключением того, что:

  • Он автоматически сгенерирует для вас набор полей на основе модели.
  • Он автоматически сгенерирует валидаторы для сериализатора, такие как валидаторы unique_toght.
  • Он включает простые реализации по умолчанию .create() и .update().

Как видите, для целей нашего простого приложения встроенные инструменты более чем способны удовлетворить наши основные потребности.

3.2.3 Создание представления

Функции просмотра принимают веб-запрос (т.е.localhost:8000/api/books) и возвращают веб-ответы, которые могут быть «HTML-содержимым веб-страницы, или перенаправлением, или ошибкой 404, или XML-документом, или изображением. . . или что-то в этом роде. ’В нашем случае мы ожидаем получить обратно данные о книгах, структурированные в формате JSON.

Создайте файл представлений в my_library/server/books/api/views.py:

from rest_framework import generics, mixins
from books.models import Book
from .serializers import  bookSerializer
class bookAPIView(mixins.CreateModelMixin, generics.ListAPIView):
  resource_name = 'books'
  serializer_class = bookSerializer
  serializer_class = bookSerializer
  def get_queryset(self):
    return Book.objects.all()
  def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

Импорт
Сначала мы импортируем generics и mixins из DRF. Затем модель Book из нашего books приложения и bookSerializer, которую мы только что создали.

generics относится к представлениям API, которые «точно соответствуют вашим моделям базы данных». Это «предварительно созданные представления, которые предоставляют часто используемые шаблоны». mixins - это классы, которые «предоставляют действия, которые используются для обеспечения основного поведения просмотра». Наша модель book упрощена и включает только атрибуты title, author и description, поэтому они предоставляют нам необходимые основы.

Представление bookAPI
Затем мы создаем bookAPIView, который принимает CreateModelMixin и ListAPIView.

CreateModelMixin предоставляет «.create(request, *args, **kwargs) метод, который реализует создание и сохранение нового экземпляра модели». Он поставляется с ответом 201 Create с «сериализованным представлением объекта» в случае успеха и ответом 400 Bad Request с подробностями об ошибках в противном случае.

ListAPIView обслуживает наши конечные точки, доступные только для чтения (GET), и используется для «представления коллекции экземпляров модели». Это используется, когда мы хотим получить все или много книг.

bookAPIView также использует недавно созданный bookSerializer вместо serializer_class.

Мы устанавливаем resource_name на «книги», чтобы «указывать type ключ в выводе json». Уровень внешнего клиентского хранилища данных будет иметь модель book, учитывающую регистр, поэтому установка здесь resource_name устраняет эту проблему в зародыше.

Функции
Функция get_queryset возвращает все объекты книги в базе данных, а post принимает запрос и аргументы и создает новую запись в базе данных книги, если запрос действителен.

3.2.4 Создание URL-адресов

URL-адреса используются для сопоставления URL-адреса (например, localhost:8000/api/books) с представлениями.

Создайте файл URL в my_library/server/books/api/urls.py:

from .views import bookAPIView
from django.conf.urls import url
urlpatterns = [
  url(r'^$', bookAPIView.as_view(), name='book-create'),
]

Импорт
Мы импортируем недавно созданные представления bookAPIView и url. Мы будем использовать url, чтобы создать список url экземпляров.

Шаблоны URL booksAPI
В массиве urlpatterns мы создаем шаблон URL со следующей структурой:

  • узор r'^$'
  • путь Python к представлению bookAPIView.as_view()
  • имя name='book-create'

Шаблон r'^$' - это регулярное выражение, которое соответствует пустой строке / строке ». Это означает, что совпадение будет найдено при посещении localhost:8000. Он соответствует всему, что идет после базового URL. Обратите внимание: это не сработает, если в конец этого URL-адреса будет добавлен /.

Мы вызываем .as_view() на bookAPIView, потому что « - это функция (метод класса), которая соединит [класс] с его URL-адресом ’. Когда данный URL-адрес посещается и сопоставляется с шаблоном URL-адреса, этот шаблон затем вернет bookAPI представление, которое мы сказали ему для ответа.

Атрибут name='book-create' предоставляет нам атрибут name, который можно использовать для ссылки на наш URL-адрес в нашем проекте. Если вы хотите изменить URL-адрес или представление, к которому он относится, его нужно изменить только здесь. Без name вам придется пройти через весь проект для обновления. Загляните в эту ветку, чтобы узнать больше.

шаблоны URL-адресов сервера
Теперь давайте откроем файл URL-адресов server my_library/server/server/urls.py:

from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^api/books', include('books.api.urls', namespace='api-books')),
]

Здесь мы импортируем include и создаем шаблон r'^api/books', который принимает любые URL-адреса, которые мы создали в папке api. Теперь базовый URL-адрес для наших books URL-адресов API становится localhost:8000/api/books. Посещение этого URL-адреса будет соответствовать нашему r'^/api/books' шаблону, который будет соответствовать r'^$' шаблону, который мы создали в нашем books API.

Мы используем namespace='api-books', чтобы URL-адреса не конфликтовали друг с другом, если они имеют одинаковое имя в другом приложении, которое мы можем создать. Узнайте больше о том, почему namespaces используются в этой ветке.

3.2.5 Демонстрация: просмотр API книг

Теперь, когда у нас есть базовая настройка фреймворка REST, давайте проверим данные, которые возвращает серверная часть. При работающем сервере зайдите на http://localhost:8000/api/books. Доступный для просмотра API должен возвращать что-то вроде этого:

3.3 Заключение

Отлично, мы действительно начинаем работу. В конце части 3 мы выполнили следующие шаги:

  • Установил Django REST Framework в наш проект
  • Приступили к созданию API книг.
  • Создал serializer для книг
  • Создал view для книг
  • Создано URLs для книг
  • Просмотрен API книг, который возвращает данные о книгах из серверной части.

В части 4 мы начнем наш проект EmberJS, который служит клиентом внешнего интерфейса. Мы установим необходимое программное обеспечение, настроим базовую модель DOM, стили, создадим book модель и books маршрут. Мы также загрузим некоторые поддельные данные, чтобы показать, как будут отображаться реальные данные из нашего бэкэнда, когда мы, наконец, получим к ним доступ.

Дальнейшее чтение

Что такое API?
Что такое Django REST Framework?
Что такое __init__.py?
Что такое сериализатор?
Что такое просмотров?
Что такое URL-адреса?
Что такое JSON?
Что такое регулярные выражения?
Что делает __init__.py?
Что такое ОТДЫХ?