Как создать drf проект python
Перейти к содержимому

Как создать drf проект python

  • автор:

Создание веб API на Django

Вы, наверное, слышали, что лучший способ учиться — это делать. Итак, в этом пошаговом руководстве мы будем создавать RESTful API с Django и Django REST Framework. Проект будет приложением планировщика событий, вроде мини-версии Eventbrite или meetup.com.

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

Вы найдете код проекта на github.

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

  1. Введение и настройка проекта.
  2. Регистрация, аутентификация и авторизация пользователей с помощью веб-токенов JSON (JWT) и djoser.
  3. Конечные точки создания событий и посещаемости.

Я постараюсь следовать аналогичной структуре в каждом посте. Это будет главным образом включать:

  1. Создание модели.
  2. Сериализаторы, представления API и их изменение в соответствии с нашими потребностями.
  3. Создание классов разрешений для наших конечных точек.
  4. Написание автоматических модульных тестов для конечных точек.
  5. Демо с postman.

Настройка проекта

Для этого проекта нам нужно установить Python 3+. Далее нам нужно создать виртуальные среды для установки зависимостей проекта.

Установить virtualenv

pip install virtualenv

Создать новый virtualenv

virtualenv yourenvname -p python3.6

Активировать виртуальную среду

Запустите эту команду в каталоге, в котором была создана виртуальная среда.

Как только ваша виртуальная среда активирована, нам понадобится ряд зависимостей для проекта.

Джанго и Django rest framework

pip install django djangorestframework

Djoser: REST-реализация системы аутентификации Django.

Библиотека Djoser предоставляет набор представлений и конечных точек Django Rest Framework для выполнения основных действий, таких как регистрация, вход в систему, выход из системы, сброс пароля и активация учетной записи. Вы могли бы создавать функции самостоятельно, но у этого есть большинство функций, которые вы можете в конечном итоге создать.

pip install djoser

django-rest-framework-simplejwt

Предоставляет серверную часть аутентификации веб-токена JSON для REST Framework Django.

pip install djangorestframework_simplejwt

Как правило, если у вас много проектных зависимостей в python, желательно поместить их в файл requirements.txt и установить их одной командой.

pip install -r requirements.txt

Чтобы запустить новый проект django, запустите следующее после активации ранее созданной виртуальной среды.

django-admin startproject eventScheduler

Теперь начнем с первого приложения, которое нам потребуется для следующего раздела:

cd eventScheduler python manage.py startapp accounts 

Пока все хорошо, я надеюсь. Если вы выполнили следующие шаги, наше приложение должно иметь следующую структуру:

./eventScheduler ├── accounts │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── eventScheduler │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-35.pyc │ │ └── settings.cpython-35.pyc │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py

Кратко о Django Rest Framework

Django Rest Framework (DRF — документация на русском) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта. Эта статья поможет понять структуру DRF и дать вводные данные для начала его использования

Основная архитектура

API DRF состоит из 3-х слоев: сериализатора, вида и маршрутизатора.

Сериализатор: преобразует информацию, хранящуюся в базе данных и определенную с помощью моделей Django, в формат, который легко и эффективно передается через API.

Вид (ViewSet): определяет функции (чтение, создание, обновление, удаление), которые будут доступны через API.

Маршрутизатор: определяет URL-адреса, которые будут предоставлять доступ к каждому виду.

Сериализаторы

Модели Django интуитивно представляют данные, хранящиеся в базе, но API должен передавать информацию в менее сложной структуре. Хотя данные будут представлены как экземпляры классов Model, их необходимо перевести в формат JSON для передачи через API.

Сериализатор DRF производит это преобразование. Когда пользователь передает информацию (например, создание нового экземпляра) через API, сериализатор берет данные, проверяет их и преобразует в нечто, что Django может сложить в экземпляр модели. Аналогичным образом, когда пользователь обращается к информации через API, соответствующие экземпляры передаются в сериализатор, который преобразовывает их в формат, который может быть легко передан пользователю как JSON.

Наиболее распространенной формой, которую принимает сериализатор DRF, является тот, который привязан непосредственно к модели Django:

class ThingSerializer(serializers.ModelSerializer): class Meta: model = Thing fields = (‘name’, )

Настройки fields позволяют точно указать, какие поля доступны этому сериализатору. В качестве альтернативы, может быть установлен exclude вместо fields, которое будет включать все поля модели, кроме тех, которые указаны в exclude.

Сериализаторы — это невероятно гибкий и мощный компонент DRF. Хотя подключение сериализатора к модели является наиболее распространенным, сериализаторы могут использоваться для создания любой структуры данных Python через API в соответствии с определенными параметрами.

Виды (ViewSets)

Сериализатор анализирует информацию в обоих направлениях (чтение и запись), тогда как ViewSet — это тот код, в котором определены доступные операции. Наиболее распространенным ViewSet является ModelViewSet, который имеет следующие встроенные операции:

  • Создание экземпляра: create ()
  • Получение / чтение экземпляра: retrieve ()
  • Обновление экземпляра (все или только выбранные поля): update () или partial_update ()
  • Уничтожение / Удаление экземпляра: destroy ()
  • Список экземпляров (с разбивкой по страницам по умолчанию): list ()

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

 class ThingViewSet(viewsets.ModelViewSet): queryset = Thing.objects.all()

Если необходимы дополнительные настройки, можно использовать общие представления, вместо ModelViewSet или даже отдельные пользовательские представления.

Маршрутизаторы (роутеры)

И наконец, маршрутизаторы: они предоставляют верхний уровень API. Чтобы избежать создания бесконечных URL-адресов вида: «списки», «детали» и «изменить», маршрутизаторы DRF объединяют все URL-адреса, необходимые для данного вида в одну строку для каждого ViewSet, например:

# Инициализация роутера DRF. Только один раз на файл urls.py # из маршрутизаторов импорта rest_framework router = routers.DefaultRouter() # Регистрация ViewSet router.register(r'thing', main_api.ThingViewSet)

Затем все ViewSet, которые зарегистрированны в маршрутизаторе, можно добавить к обычным url_patterns:

url_patterns + = url (r '^', include (router.urls))

Теперь через API можно получить данные точно так же, как и любые другие обычные страницы Django.

Установка Django Rest Framework

На этом занятии мы сделаем первый практический шаг – выполним установку Django REST Framework. Этот пакет устанавливается в проект сайта, работающего на Django. Поэтому вначале нам нужно создать учебный сайт и начать с установки фреймворка Django.

Сначала я думал взять уже готовый проект из предыдущего курса по Django, но потом решил, что будет проще и понятнее, если мы создадим с нуля простое приложение без каких-либо излишеств. Но за основу я возьму все тот же проект по знаменитым женщинам.

Я сейчас не буду подробно объяснять создание проекта сайта на Django, если вы этого не знаете, то смотрите плейлист по этому фреймворку:

Вначале нам нужно создать виртуальное окружение установить туда интерпретатор Python и фреймворк Django. Я все буду делать непосредственно через PyCharm.

У меня уже создана папка drf:

в которую и буду устанавливать виртуальное окружение. Для этого в PyCharm создаем новый проект:

File -> New Project

В поле «Location» прописываем «D:\Python\django\drf». Затем, отмечаем пункт «New environment using» и прописываем путь «D:\Python\django\drf\venv». Убираем галочку «Create a main.py …» и нажимаем кнопку «Create». У нас начинается создание виртуального окружения.

Переходим во вкладку «Terminal» и у нас здесь должно быть уже активное виртуальное окружение (в круглых скобках прописано venv).

Находясь в рабочем каталОге «D:\Python\django\drf» выполняем установку фреймворка Django:

pip install django

После установки создаем проект сайта на django с помощью команды:

django-admin startproject drfsite

(здесь drfsite – название проекта, обычно совпадает с доменным именем сайта).

У нас появится каталОг drfsite с пакетом drfsite и набором известных вам уже файлов. Перейдем в папку drfsite:

И для проверки работоспособности сайта выполним команду:

python manage.py runserver

Если сайт корректно отображается в браузере, значит, все было сделано верно.

Далее, выполним миграции для создания таблиц в БД. В учебных целях я оставлю БД SQLite, чтобы не перегружать материал. В дальнейшем к проекту достаточно просто можно подключить любую другую СУБД. Итак, выполняем команду:

python manage.py migrate

Затем, в файле drfsite/settings.py установим русский язык для нашего сайта:

LANGUAGE_CODE = 'ru'

и поменяем временную зону:

TIME_ZONE = 'Europe/Moscow'

Следующим шагом создадим основное приложение сайта. Так как сайт посвящен известным женщинам, то приложение я назвал women:

python manage.py startapp women

Прописываем наше приложение в списке INSTALLED_APPS установленных приложений (в файле drfsite/settings.py):

INSTALLED_APPS = [ . 'women.apps.WomenConfig', ]

Далее, нам нужны будут модели для работы с таблицами БД. Я возьму классы моделей из курса по Django, где мы создавали таблицу для хранения информации по женщинам, а также отдельную таблицу category, которая содержала категории женщин: певицы, актрисы, спортсменки и т.п.

В файле women/models.py, прописываем следующие классы:

from django.db import models class Women(models.Model): title = models.CharField(max_length=255) content = models.TextField(blank=True) time_create = models.DateTimeField(auto_now_add=True) time_update = models.DateTimeField(auto_now=True) is_published = models.BooleanField(default=True) cat = models.ForeignKey('Category', on_delete=models.PROTECT, null=True) def __str__(self): return self.title class Category(models.Model): name = models.CharField(max_length=100, db_index=True) def __str__(self): return self.name

Как видите, я записываю все по минимуму. После определения классов моделей нам нужно создать для них миграции:

python manage.py makemigrations

python manage.py migrate

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

python manage.py createsuperuser

Здесь нам будет предложено указать логин (имя пользователя). В учебных целях я укажу root. Далее, нужно ввести адрес электронной почты, пусть это будет root@drfsite.ru. (Почта может быть не существующей в учебном проекте, а вообще, нужно указывать адрес реальной почты, на которую будут приходить служебные сообщения). И, наконец, вводим пароль (1234) и повторяем его.

Все, суперпользователь создан и мы теперь можем войти в админку, указав root и пароль 1234. Запускаем тестовый веб-сервер:

python manage.py runserver

Переходим по адресу:

Чтобы в админ-панели появилось наше приложение Women его нужно зарегистрировать. Для этого откроем файл women/admin.py, который отвечает за взаимосвязь приложения с админкой, где мы будем регистрировать наши модели. Вначале импортируем их:

from .models import *

и зарегистрируем модель Women:

admin.site.register(Women)

Возвращаемся в админку и при обновлении главной страницы видим наше приложение и зарегистрированную модель Women. Если щелкнуть по ней, то видим список наших записей и здесь же можем их редактировать, удалять и добавлять новые.

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

Введем: 1 – актрисы; 2 – певицы. Теперь мы можем выбирать одну из двух категорий. Добавим несколько записей (берем заготовку).

Установка Django REST Framework

Все, наше тестовый учебный проект готов и теперь мы можем приступить непосредственно к установке Django REST Framework. Выполним команду:

pip install djangorestframework

Далее, нам нужно его зарегистрировать как приложение. Переходим в файл drfsite/settings.py и в коллекции INSTALLED_APPS прописываем строчку:

INSTALLED_APPS = [ . 'rest_framework', ]

В принципе все, пакет установлен и готов к работе. Чтобы увидеть его в действии нам в программе нужно определить представление, которое будет срабатывать на запрос от пользователя и сериализатор. Начнем с представления, которые мы с вами уже много раз делали в проекте на Django. Здесь то же самое. Переходим в файл women/views.py и записываем следующий класс для DRF:

from rest_framework import generics from .models import Women class WomenAPIView(generics.ListAPIView): queryset = Women.objects.all() serializer_class = WomenSerializer

Наш класс WomenAPIView наследуется от базового ListAPIView, который берется из DRF и реализует функционал по формированию JSON-списка из записей таблицы Women.

Чтобы представление «знало» как формировать ответ, нужно определить класс сериализатора WomenSerializer. Для этого создадим еще один файл serializers.py в приложении women и определим класс WomenSerializer:

from rest_framework import serializers from .models import Women class WomenSerializer(serializers.ModelSerializer): class Meta: model = Women fields = ('title', 'cat_id')

Пока здесь вам может быть далеко не все понятно. Мы обо всем подробно будем говорить на последующих занятиях. Сейчас я просто показываю пример использования Django REST Framework не более того.

Последним шагом нам нужно прописать маршрут для активации представления. Переходим в файл drfsite/urls.py и записываем:

from women.views import * urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/womenlist/', WomenAPIView.as_view()), ]

Все готово. Давайте протестируем. Запускаем веб-сервер:

python manage.py runserver

Переходим по адресу:

и видим ответ в виде JSON-строки со списком данных из таблицы Women:

Этот формат вывод JSON ответа в веб-браузере определен в пакете Django REST Framework для возможности тестирования создаваемого API. Конечному устройству будет передаваться только JSON-строка и заголовок ответа. Далее, приложение, которое отправляло этот API-запрос, может выполнить парсинг полученных данных и, например, отобразить их на экране смартфона. Так происходит взаимодействие между сайтом и другими сторонними приложениями.

Из этого занятия вам достаточно понять, как устанавливается Django REST Framework, а в качестве практики, попробуйте повторить этот тестовый пример.

Видео по теме

#1. Django REST Framework — что это такое

#2. Установка Django Rest Framework

#3. Базовый класс APIView для представлений

#4. Введение в сериализацию. Класс Serializer

#5. Методы save(), create() и update() класса Serializer

#6. Класс ModelSerializer и представление ListCreateAPIView

#7. Представления UpdateAPIView и RetrieveUpdateDestroyAPIView

#8. Viewsets и ModelViewSet

#9. Роутеры: SimpleRouter и DefaultRouter

#10. Ограничения доступа (permissions)

#11. Авторизация и аутентификация. Session-based authentication

#12. Аутентификация по токенам. Пакет Djoser

#13. Идея авторизации по JWT-токенам

#14. Делаем авторизацию по JWT-токенам

#15. Добавляем пагинацию (pagination)

© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Quickstart

We’re going to create a simple API to allow admin users to view and edit the users and groups in the system.

Project setup

Create a new Django project named tutorial , then start a new app called quickstart .

# Create the project directory mkdir tutorial cd tutorial # Create a virtual environment to isolate our package dependencies locally python3 -m venv env source env/bin/activate # On Windows use `env\Scripts\activate` # Install Django and Django REST framework into the virtual environment pip install django pip install djangorestframework # Set up a new project with a single application django-admin startproject tutorial . # Note the trailing '.' character cd tutorial django-admin startapp quickstart cd .. 

The project layout should look like:

$ pwd /tutorial $ find . . ./tutorial ./tutorial/asgi.py ./tutorial/__init__.py ./tutorial/quickstart ./tutorial/quickstart/migrations ./tutorial/quickstart/migrations/__init__.py ./tutorial/quickstart/models.py ./tutorial/quickstart/__init__.py ./tutorial/quickstart/apps.py ./tutorial/quickstart/admin.py ./tutorial/quickstart/tests.py ./tutorial/quickstart/views.py ./tutorial/settings.py ./tutorial/urls.py ./tutorial/wsgi.py ./env ./env/. ./manage.py 

It may look unusual that the application has been created within the project directory. Using the project’s namespace avoids name clashes with external modules (a topic that goes outside the scope of the quickstart).

Now sync your database for the first time:

python manage.py migrate 

We’ll also create an initial user named admin with a password. We’ll authenticate as that user later in our example.

python manage.py createsuperuser --username admin --email admin@example.com 

Once you’ve set up a database and the initial user is created and ready to go, open up the app’s directory and we’ll get coding.

Serializers

First up we’re going to define some serializers. Let’s create a new module named tutorial/quickstart/serializers.py that we’ll use for our data representations.

from django.contrib.auth.models import Group, User from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ['url', 'username', 'email', 'groups'] class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ['url', 'name'] 

Notice that we’re using hyperlinked relations in this case with HyperlinkedModelSerializer . You can also use primary key and various other relationships, but hyperlinking is good RESTful design.

Views

Right, we’d better write some views then. Open tutorial/quickstart/views.py and get typing.

from django.contrib.auth.models import Group, User from rest_framework import permissions, viewsets from tutorial.quickstart.serializers import GroupSerializer, UserSerializer class UserViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ queryset = User.objects.all().order_by('-date_joined') serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated] class GroupViewSet(viewsets.ModelViewSet): """ API endpoint that allows groups to be viewed or edited. """ queryset = Group.objects.all() serializer_class = GroupSerializer permission_classes = [permissions.IsAuthenticated] 

Rather than write multiple views we’re grouping together all the common behavior into classes called ViewSets .

We can easily break these down into individual views if we need to, but using viewsets keeps the view logic nicely organized as well as being very concise.

URLs

Okay, now let’s wire up the API URLs. On to tutorial/urls.py .

from django.urls import include, path from rest_framework import routers from tutorial.quickstart import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet) router.register(r'groups', views.GroupViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ path('', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ] urlpatterns += router.urls 

Because we’re using viewsets instead of views, we can automatically generate the URL conf for our API, by simply registering the viewsets with a router class.

Again, if we need more control over the API URLs we can simply drop down to using regular class-based views, and writing the URL conf explicitly.

Finally, we’re including default login and logout views for use with the browsable API. That’s optional, but useful if your API requires authentication and you want to use the browsable API.

Pagination

Pagination allows you to control how many objects per page are returned. To enable it add the following lines to tutorial/settings.py

REST_FRAMEWORK =

Settings

Add ‘rest_framework’ to INSTALLED_APPS . The settings module will be in tutorial/settings.py

INSTALLED_APPS = [ . 'rest_framework', ] 

Testing our API

We’re now ready to test the API we’ve built. Let’s fire up the server from the command line.

python manage.py runserver 

We can now access our API, both from the command-line, using tools like curl .

bash: curl -u admin -H 'Accept: application/json; indent=4' http://127.0.0.1:8000/users/ Enter host password for user 'admin': < "count": 1, "next": null, "previous": null, "results": [ < "url": "http://127.0.0.1:8000/users/1/", "username": "admin", "email": "admin@example.com", "groups": [] >] > 

Or using the httpie, command line tool.

bash: http -a admin http://127.0.0.1:8000/users/ http: password for admin@127.0.0.1:8000:: $HTTP/1.1 200 OK . < "count": 1, "next": null, "previous": null, "results": [ < "email": "admin@example.com", "groups": [], "url": "http://127.0.0.1:8000/users/1/", "username": "admin" >] > 

Or directly through the browser, by going to the URL http://127.0.0.1:8000/users/ .

Quick start image

If you’re working through the browser, make sure to login using the control in the top right corner.

Great, that was easy!

If you want to get a more in depth understanding of how REST framework fits together head on over to the tutorial, or start browsing the API guide.

Documentation built with MkDocs.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *