658 подписчиков

Документирование. Стандарты API часть 1

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит:

  1. Создать документацию к API. (Тут будут использоваться наработки из предыдущей работы.
  2. Проанализировать скорость работы API.
  3. Создать калькулятор JSON-RPC.

Задача 1. Создание документации к API

Добавьте документацию для ресурсов, которые реализовали в практической работе прошлого модуля.
Напишите спецификацию для api/books/ в формате YAML, а для api/authors/ — в формате JSON или Python-словаря.
Если в прошлом модуле вы использовали Flask-RESTX, можете применить возможности этой библиотеки по созданию Swagger-документации. Узнать о них подробнее можно в этой статье.

Первым делом, чтобы не подвергать изменениям предыдущую работу, я скопировал директорию app со всеми файлами в директорию нынешней практической работы (18) ../homework/hw1. И начал потихоньку прописывать спецификацию в формате YAML, для api/books/ и в конечном итоге у меня получился вот такой вот результат в браузере:

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-2

И даже все менюшечки там работают, делают запросы и получают какие-то ответы. Вот, для примера, менюшечка PATCH:

Если нажать на кнопочку Try it out, то можно частично или полностью изменить информацию о книге прямо отсюда, из браузера
Если нажать на кнопочку Try it out, то можно частично или полностью изменить информацию о книге прямо отсюда, из браузера

Теперь о трудностях: Я долго разбирался в форматах swagger документации, из лекций (раза четыре пересматривал) ничего не понял, ну или почти... Я не понимал логики работы swagger-файла, ни в YAML, ни в JSON форматах. Каков принцип построения этой документации?! Дошло случайно.

Мне нужно было реализовать ввод из строки браузера, а так же ввод данных для объекта Book()... И я читал документацию к swagger, и в интернетах искал. Но как сформулировать правильный запрос?! Х.З!!! И дошло до меня буквально случайно!

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-4
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-5

Теперь о вводе данных, как это реализуется:

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-6

И будет выглядеть в браузере вот так:

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-7

Весь код swagger уместился в одну строчку, в файле routers.py:

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-8

Ну и собственно, листинг моего файла спецификации swagger.yaml:

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-9
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-10
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-11
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-12

Ну вот, для эндпойнта /api/books написана спецификация swagger в формате YAML. Нужно теперь сделать для /api/authors, в формате JSON.

Как показало написание кода JSON не работает в @swag_from... Поэтому эту большую "портянку" пришлось разделить на маленькие кусочки, для каждого эндпойнта с его методами. Ну и как было положено написал для /api/books в формате YAML, а для /api/authors - JSON, и таки умудрился вместить оба формата в одну страницу:

Вот такая получилась красота! Все менюшечки проверены: получают, создают, удаляют, изменяют...
Вот такая получилась красота! Все менюшечки проверены: получают, создают, удаляют, изменяют...

JSON у меня получился вот таким:

А "портянку" YAML, я разбил на вот такие маленькие файлы и упрятал в отдельную директорию, по идее и JSON туда же нужно отправить... Что я в последствии и сделал...

Файл routers.py получился примерно таким...

Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-15
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-16
Продолжаем наше обучению языку python. 18-е практическое занятие, в которое входит: Задача 1.-17

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

Хотел было всю работу в статью записать, но уж больно длинные повествования получаются. Так что разделю на части...

ЗЫ. Данная работа несет чисто ознакомительный характер, это мой конспект по данной работе.

Ну вы знаете что делать, лайк, подписка, комментарий. Это все помогает продвинуть канал в поисковых системах Яндекса.


Да пребудет с вами СИЛА!