Это вторая часть Hello Django Rest Framework. В Части 1 мы рассмотрели настройку внутреннего API, написанного на Python с использованием Django Rest Framework. Это сделает еще один шаг вперед и будет иметь дело с небольшим извлечением данных и аутентификацией токена. Итак, приступим!

Предполагая, что у вас все те же настройки из Части 1(https://medium.com/@charliemday31/hello-django-rest-framework-fa47cb7a981d), мы начнем с создания новое приложение в рамках нашего проекта django с использованием надежного

django-admin startapp data

И не забывайте, всякий раз, когда мы создаем новое приложение, мы должны добавить его в INSTALLED_APPS в нашей папке настроек (backend/settings.py).

INSTALLED_APPS = [
  ...
  'data' # This is our app
]

Теперь перейдите в папку backend/data и создайте два новых файла: urls.py и serializers.py. Удобная команда, если вы используете терминал для создания новых файлов:

touch urls.py serializers.py

Итак, давайте подключим наш backend/urls.py

urlpatterns = [
  ...
  path('data/', include('data.urls')) # Our data path
]

…в наш файл backend/data/urls.py

from django.urls import path
from data import views
urlpatterns = [
  ...
  path('coders/', views.CoderView.as_view()),
]

Второй набор urlpatterns — это просто представление, которое мы собираемся создать следующим… его можно назвать как угодно, если оно соответствует URL-адресам, но для этого мы собираемся получить список известных кодеров из нашей базы данных.

Давайте создадим наше представление, чтобы мы могли проверить работоспособность и убедиться, что на нашем сервере нет ошибок. Ваши представления сохраняются в файле backend/data/views.py.

from django.shortcuts import render
from rest_framework import views
from rest_framework.response import Response

# Create your views here.
class CoderView(views.APIView):
      def get(self, request):
         return Response('This works!')

Теперь в каталоге to level запустите свой сервер с помощью

python manage.py runserver

Ваш терминал должен быть безошибочным, как это

Откройте Postman (или любое другое программное обеспечение для тестирования API) и убедитесь, что вы получаете хороший ответ от http://localhost:8000/data/coder. Мы будем делать простой GET-запрос (но вы, наверное, уже догадались)

Круто, так что это работает, как и ожидалось.

Теперь мы собираемся добавить нашу первую модель. модель django — это модель в нашей базе данных. Мы создадим модель Coder, которая будет содержать 3 части информации:

  1. Имя
  2. Дата рождения
  3. Пол

Откройте файл backend/data/models.py и создайте модель.

Краткий обзор того, что делает этот фрагмент кода… мы создаем класс (наша модель) с именем Coder и добавляем имя (которое является символьным полем), их дату рождения (поле даты) и их пол (это символьное поле с двумя вариантами выбора — М или Ж)

Перейдите на страницу http://localhost:8000/admin и войдите в систему. Мы собираемся создать новые данные в рамках нашей новой модели Coder.

У вас, вероятно, будут похожие данные, но они не будут отображаться в этом формате… чтобы «украсить» нашу модель администратора, перейдите к backend/data/admin.py и измените наш класс администратора с помощью этого

@admin.register(Coder)
class CoderAdmin(admin.ModelAdmin):
      list_display = ('name', 'dob', 'gender')

Итак, у нас есть некоторые данные! Давайте посмотрим, сможем ли мы передать его в наш API. Перейдите к нашему файлу backend/data/serializers.py и создайте наш первый сериализатор. Сериализатор в DRF позволяет нам брать экземпляры нашей модели и преобразовывать их в удобочитаемый формат JSON.

from rest_framework import serializers
from .models import Coder
class CoderSerializer(serializers.ModelSerializer):
      # Meta is simply metadata about the class
      class Meta():
          model = Coder # Define our model 
          fields = "__all__" # Define that we want 'all' the fields

Давайте вернем данные в наш файл backend/data/views.py.

class CoderView(views.APIView):
      
      def get(self, request):
         coders = Coder.objects.all()
         serializer = CoderSerializer(coders, many=True) 
         return Response(serializer.data)

Вы, вероятно, можете догадаться, что это делает. По сути, мы получаем все экземпляры из моделей Coder, затем передаем их в наш Coder Serializer (не забудьте импортировать свой CoderSerializer) и обеспечиваем many=True и наконец, вернуть наш ответ.

Быстрая проверка Postman, чтобы убедиться, что наш API работает

Мы также можем воспользоваться преимуществами DRF и более эффективно использовать ListAPIView следующим образом (backend/data/views.py)

from rest_framework.generics import ListAPIView
class CoderView(ListAPIView):
      serializer_class = CoderSerializer
      queryset = Coder.objects.all()

Это намного чище и достигает того же самого! Я продемонстрировал первый способ избежать черного ящика мышления и попытаться понять, как DRF творит чудеса. Если вы хотите пойти дальше (что я настоятельно рекомендую!), откройте этот файл в Visual Studio Coder и, удерживая Command, щелкните ListAPIView, и вы сможете заглянуть под капот и спуститься в кроличью нору.

Допустим, мы хотим пойти еще дальше и добавить аутентификацию, чтобы только зарегистрированные пользователи могли получить доступ к этим данным. Мы добавим токены Django. Для начала перейдите в свой файл backend/backend/settings.py и добавьте rest_framework.authtoken в INSTALLED_APPS:

Кроме того, нам нужно добавить несколько AUTHENTICATION_CLASSES. К ним относятся наши DEFAULT_PERMISSION_CLASSES, которые в основном означают, что по умолчанию все требует аутентификации, если мы не укажем иное. Это делает наше приложение более безопасным и менее уязвимым к человеческим ошибкам. Кроме того, мы добавили желаемый тип аутентификации — TokenAuthentication. Наконец, давайте запустим python manage.py migrate, так как мы внесли некоторые изменения в модель, потому что Django Tokens создает новую модель.

Зайдите на Postman и протестируйте наш API /coders. Что вы получаете?

Идеально! Теперь не каждый может получить доступ к нашим данным — они должны иметь аутентифицированные учетные данные. Итак, вы можете догадаться, куда идет следующий шаг…?

Да, верно… мы собираемся получить несколько аутентифицированных учетных данных. Если вы следовали моему последнему сообщению, мы сделали простой вход в систему, это обновленный код с включением проверки/создания токенов Django.

Теперь снова запустите Postman с желаемым именем пользователя («admin») и паролем («*****»), чтобы вернуть свой токен.

Отлично, мы получили наш токен. Есть более быстрые способы сделать это (например, с помощью DRF по умолчанию views.obtain_auth_token), однако я хотел показать больше логики и меньше магии.

В основном происходит то, что создается совершенно новая модель (вы можете проверить ее на своей странице администратора) под названием Токены, и между пользователем и его токеном существует связь OneToOne, вы можете проверить официальную DRF GitHub и перейдите к rest_framework/authtoken/models.py. Токен — это, по сути, пароль, который они [пользователи] не знают, который более безопасен, чем простой текстовый пароль, который можно угадать, однако он менее безопасен, чем токены JWT (о них я сделаю еще один пост), но токены Django являются стандартом для подготовки производства приложения DRF. Теперь, когда мы добавим какой-либо интерфейс с этим (будь то веб-сайт, созданный в React, или мобильное приложение, созданное в React Native), токен авторизации будет добавлен в наши заголовки, и именно так Django узнает, кому передавать данные.

Далее давайте воспользуемся этим вновь созданным токеном, чтобы попытаться получить доступ к представлению данных кодеров, которое мы создали ранее. Мы можем добавить наш токен в заголовок авторизации в Postman следующим образом:

И, если повезет, попробуйте снова вызвать API /coders. У вас должно получиться что-то вроде этого…

Оно работает! Поздравляем, теперь вы создали безопасное (только для разработки!) серверное приложение.