Блог изнутри (api, часть 1)
Фев 10, 2020 в 13:08  •  11 мин  •  читали 578 раз

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


Для сервера я использовал следующий стек: python flask + mongodb.


Развернут блог на heroku. Развернут как два отдельных приложения. Одно для бэкенда, второе для фронта.


Фронт использует Vue ssr (nuxt).


Но в этой статье мы поговорим о том, как работает сервер этого блога.


Начнем!


Я буду вставлять скриншоты кода, чтобы в случае, если Вы захотите повторить это, Вы писали сами и вдумывались в то, что пишете. Иначе будет тупой ctrl-c/ctrl-v. К тому же пока что нет подсветки кода 🙃.


Сначала посмотрим на импорты проекта:


Не вижу смысла что то комментировать. Поэтому двигаем дальше.


Теперь давайте посмотрим на инициализацию всего-всего:

Тут указываются переменные, нужные для корректной работы mongodb, ключ для JWT и настройки CORS.


Далее мы будем говорить о том, как происходит выдача статей и для общего понимания посмотрим на структуру статьи в базе:

_id - это поле генерируемое монгой. Остальное, я думаю, и так понятно. Картинки хранятся внутри самой статьи закодированные base64.


Теперь можно двинуться дальше.


Метод, с которого начинается работа с блогом - метод получения всех статей.

GET /articles[?sort=(new|popular)]



Тут нужно кое-что прояснить. Метод получает дополнительный параметр запроса - sort. Нетрудно догадаться, что он нужен для сортировки либо по дате создания, либо по популярности. Под популярностью статью подразумевается количество просмотров оной.


Следующий метод - это метод получения отдельной статьи

GET /article/:path



Он отдает нам статью из базы данных по ее пути. Путь в моей терминологии - транслитерированный заголовок статьи, в котором все небуквы заменяются на '-'. На английском такая операция называется slugify. Можете написать в комментариях ее название на русском, если знаете.


Собственно, мы пытаемся получить статью по ее path. Если мы ее не находим, с сервера возвращается код 404 и Вы видите ошибку:

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


Однако в момент, когда Вы переходите на статью Вы получаете не только ее а еще и комментарии к ней. Это возможно благодаря следующему методу:


GET /article/:path/comments



В каждом объекте комментария есть поле article_ref, оно нужно, чтобы соотносить статьи и комментарии к ним. Мы находим все комментарии к статье и сортируем по дате публикации. В случае, если ничего не найдено, нам просто вернется пустой массив.


Вы спросите: но откуда же у статей появляются комментарии? А вот откуда:


POST /article/:path/comments



Это первый POST метод, который я описываю в этой статье. Он нужен нам для создания комментария к определенной статье по ее path. После создания, мы получаем id комментария в его коллекции, который mongodb присваивает автоматически. Потом по этому id мы получаем сам объект комментария, он и возвращается нам на клиент с кодом 200.


Потом приложение просто запускается:


В целях безопасности были упущены методы получения JWT токенов и создания статьи. Простите))))


В этой статье мы рассмотрели как работает API блога, в следующей части из цикла 'Блог изнутри' мы рассмотрим деплой сервера на heroku.


Спасибо за внимание!


ps. Гуру бэкенда, не судите строго, я не из вашего лагеря)))

Копирование материалов допускается только с разрешения автора (vladivanov.dev@gmail.com) в письменной форме.
(Copying of materials is allowed only with the written permission of the author)