В части 3 мы используем Django REST Framework для создания нашего books
API. books
API имеет сериализаторы, представления и URL-адреса, которые запрашивают, структурируют и доставляют данные книги из базы данных в конечные точки API.
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 Frameworkpip install djangorestframework
# install Markdown support for the browsable APIpip 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?
Что такое ОТДЫХ?