Django 5 для начинающих

Прогресс по курсу:  9/1004

8.8 Схемы и документация
2 из 2 шагов пройдено

Схема

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

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

Схема - это машиночитаемый документ, в котором описаны все доступные конечные точки API, URL-адреса и HTTP-запросы (GET, POST, PUT, DELETE и т.д.). Это здорово, но не очень удобно для чтения человеком. Поэтому вводим документацию, которая представляет собой нечто, добавленное в схему, что облегчает ее чтение для человека.

В этой главе мы добавим как машиночитаемую схему, так и человекочитаемую документацию в наш проект Blog. Что еще лучше, мы автоматизируем генерацию каждой из них, чтобы они всегда соответствовали последней версии нашего API.

Спецификация OpenAPI является текущим стандартным способом документирования API. Она описывает общие правила формата для доступных конечных точек, входов, методов аутентификации, контактной информации и многое другое.

На момент написания этого курса drf-spectacular является рекомендуемым сторонним пакетом для генерации схемы OpenAPI для Django REST Framework.

Чтобы начать, установите drf-spectacular с помощью Pip, обычным способом:

pip install drf-spectacular


Добавьте его в конфигурацию INSTALLED_APPS в файле mysite/settings.py:

INSTALLED_APPS = [
...
...
    # API
    'rest_framework',
    'blog_api.apps.BlogApiConfig',
    'django_filters',
    'rest_framework.authtoken',
    'drf_spectacular', # new
]


Затем зарегистрируйте drf-spectacular в секции REST_FRAMEWORK:

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticated",
    ],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 5,

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        "rest_framework.authentication.TokenAuthentication",
    ),
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',  # new
}


Последним шагом является добавление некоторых метаданных, таких как название, описание и версия. В mysite/settings.py и добавьте следующее:

SPECTACULAR_SETTINGS = {
    "TITLE": "Blog API Project",
    "DESCRIPTION": "A sample blog to learn about DRF",
    "VERSION": "1.0.0",
    # OTHER SETTINGS
}


Чтобы сгенерировать схему как отдельный файл, мы можем использовать команду управления и указать имя файла, которым будет schema.yml:

python manage.py spectacular --file schema.yml


В корневом каталоге проекта был создан новый файл schema.yml:

Если вы откроете этот файл в вашем текстовом редакторе, он довольно длинный и не очень удобный для человека.

 

Динамическая схема

Более динамичный подход заключается в предоставлении схемы непосредственно из нашего API в виде URL-маршрута. Мы для этого импортируем SpectacularAPIView и добавим новый URL путь по адресу api/schema/, чтобы отобразить её. Для этого в blog_api/urls.py добавим следующий код:

from django.urls import path, re_path
from .views import PostList, PostDetail, UserPostList
from drf_spectacular.views import SpectacularAPIView # new

urlpatterns = [
    path("<int:pk>/", PostDetail.as_view(), name="post_detail"),
    path("", PostList.as_view(), name="post_list"),
    re_path('^user/(?P<username>.+)/$', UserPostList.as_view()),
    path("schema/", SpectacularAPIView.as_view(), name="schema"),  # new
]


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

python manage.py runserver

И перейдите к новой схеме. URL конечной точки по адресу http://127.0.0.1:8000/api/schema/. Автоматически сгенерированный файл схемы всего нашего API доступен и будет загружен в виде файла.

Лично я предпочитаю динамический подход в проектах, а не необходимость заново генерировать файл schema.yml при каждом изменении API.


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Тут, наверно, подразумевается "вводим"?

"Поэтому водим документацию, которая представляет собой нечто, добавленное в схему, что облегчает ее чтение для человека."

А здесь или "и" пропустили, или дублирование текста. Смотря что по смыслу хотели донести.

"В этой главе мы добавим как машиночитаемую схему, так и человекочитаемую документацию в наш проект Blog. Что еще лучше, мы автоматизируем генерацию каждой из них, чтобы они всегда были чтобы они всегда соответствовали последней версии нашего API."

@Aleksandr_Gurov, спасибо, исправил.

Это уже не новое

@Марат_Асылбаев, исправил, спасибо.

На момент написания этого курса drf-spectacular является рекомендуемым сторонним пакет для генерации схемы OpenAPI для Django REST Framework.

 

Мы для этого импортируем SpectacularAPIView и добавим новый URL путь по адресу api/schema/, чтобы чтобы отобразить ее.

@Георгий_Тимофеев, исправил, спасибо.

Добрый день, у меня вот такая ошибка и никак не могу понять откуда она тянется, можете подсказать?

@Маркелов_Александр, посмотрите в коде модели всё ли добавлено отсюда https://stepik.org/lesson/972304/step/3?unit=979116.

@Дмитрий_Селезнев, ошибка была там, спасибо большое!

При попытке генерации схемы появляется такая ошибка: ModuleNotFoundError: No module named 'rest_framework.authtokendrf_spectacular'

Пробовал удалить и повторно установить, но безуспешно(

@Maxim_Lapshin, Проверьте еще раз, весь ли код из этой лекции вы добавили в проект. Если ошибку не найдете ошибку, то выполните команду:

pip freeze > requirements.txt

И загрузите архив проекта по ссылке https://mega.nz/filerequest/rANtUqzWHQ4 

@Maxim_Lapshin, Запятой не хватает:

    'django_filters',
    'rest_framework.authtoken'
    'drf_spectacular',

@Илья_Перминов, Спасибо большое! Нелепая ошибка

сейчас получается, что любой юзер может эту схему загрузить

И мне вот не оч нравится, что она автоматом качается, как сделать кнопку для скачивания? Или мб это не нужно тут? Спасибо!

@Никита_Ильин, В нашем случае мы просто подключаем встроенный класс SpectacularAPIView. Тут уже нужно смотреть его, и я думаю есть возможность переопределить метод получения файла.

@Илья_Перминов@Никита_Ильин, Если я правильно понял, нужно только ограничить доступ к схеме.

Вот так можно ограничить только для авторизованных пользователей (все изменения в приложении blog_api:

views.py

from drf_spectacular.views import SpectacularAPIView

class MySpectacularAPIView(LoginRequiredMixin, SpectacularAPIView):
    login_url = '/api-auth/login/?next=/api/schema/'

urls.py

path("schema/", MySpectacularAPIView.as_view(), name="schema"),

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