Узнайте, как создать Flask REST API, который может получать мемы и цитаты из Reddit.

Как Front-End разработчик, если вы погружаетесь в тонкости Backend-разработки и не знаете, какие у вас есть варианты, то лучшим вариантом для вас будет начать с Python. Python - это интерпретируемый язык, который нашел применение веб-разработчикам, специалистам по данным, разработчикам приложений и многим другим. Благодаря довольно щадящей кривой обучения и легкому для понимания синтаксису, это будет лучший вариант для вас довольно быстро начать свое путешествие по Backend-разработке.

Как и любой другой язык, у Python есть множество фреймворков для разработки серверных интерфейсов. Некоторые из самых популярных - Django, Flask, Web2Py и другие. Они используются для довольно быстрой настройки и помогают начать работу с бизнес-логикой вашего приложения и взаимодействовать с уровнем базы данных. В этой статье мы рассмотрим в первую очередь Flask и то, как вы можете довольно быстро разработать интерфейс прикладного программирования (API) с помощью Flask, который может доставить вам мемы и цитаты.

Что такое Flask

Flask - это Micro Web-Framework, который используется для разработки внутреннего интерфейса для вашего приложения. Это легкий фреймворк, который занимает мало места и может использоваться для довольно быстрой настройки с простым, но расширяемым ядром. Говоря о Backend, мы должны понимать, что это служба, которая отправляет данные с сервера пользователю, который присутствует на стороне клиента.

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

Эти API-интерфейсы можно использовать для завершения операций, и, следовательно, они широко используются для разработки внутренних интерфейсов и обеспечения их взаимодействия с клиентским интерфейсом. Один из наиболее распространенных шаблонов API, который используется сегодня, - это REST API, где REST означает передачу репрезентативного состояния. Они используют протокол передачи гипертекста (HTTP) и могут передаваться через HTTP-запрос, в котором указывается операция, которую необходимо выполнить.

Flask можно использовать для разработки этих REST API, где простые методы HTTP могут использоваться для связи между клиентским и серверным интерфейсами. Каждый запрос API состоит из четырех частей: Конечная точка, Метод, Заголовок и Тело.

Конечная точка определяет URL-маршрут, который запрашивает Пользователь, в то время как Метод определяет тип запроса. Это может быть запрос GET, POST, DELETE или PUT / PATCH. Заголовок - это часть информации, которая обычно передается для аутентификации между клиентом и сервером, в то время как тело определяет информацию, которую нам нужно передать на сервер.

Это был довольно быстрый способ резюмировать все, что происходило на стороне сервера. Давайте посмотрим, как Flask можно использовать для быстрого создания API, который может вернуть нам дату и время нашего текущего запроса в формате JSON:

Нам удалось скомпоновать две конечные точки для нашего Flask API в 15 строках кода. Декоратор @ app.route сопоставляет HTTP-запросы с функциями и возвращает HTTP-ответы в форме JSON. jsonify обертывает Datetime в сообщении и передает его как HTTP-ответ.

Давайте создадим приложение

Теперь мы будем создавать API, который может получать мемы для нас, и мы определим несколько конечных точек для нашего приложения, чтобы предоставить пользователю возможности расширяемости и настройки. Мы будем использовать Praw, который представляет собой оболочку Python Reddit API Wrapper, чтобы получать мемы прямо из Reddit. Давайте начнем с создания виртуальной среды для нашей цели.

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

$ pip install virtualenv

После установки virtualenv вы можете активировать виртуальную среду, нажав простую команду:

$ virtualenv env

Это создаст новый исполняемый файл Python в вашем текущем каталоге. После завершения установки вы можете перейти к активации виртуальной среды:

$ activate

В качестве альтернативы вы можете deactivate свою виртуальную среду с помощью простой команды, если это необходимо. Давайте перейдем к созданию простого Flask API. Введите следующую команду и введите:

$ pip install flask

Откройте VS Code / PyCharm, создайте файл app.py и введите следующий код:

Начните свой код, открыв командную строку и нажав: python app.py. Это запустит ваш код, и у вас будет веб-сервер, работающий на порту 5000 с сообщением 'Hello World from Python Flask!'. Довольно просто, не так ли?

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

$ pip install praw

Перейдите на страницу документации Praw и узнайте, как можно выполнить аутентификацию OAuth, прежде чем использовать Wrapper в своем API. Вы можете зарегистрировать свое приложение для создания веб-приложения, и вы получите следующее:

  1. Идентификатор клиента, представляющий собой 14-символьную строку.
  2. Секрет клиента, представляющий собой строку из 27 символов.
  3. Пароль для учетной записи Reddit, которую вы используете.
  4. Имя пользователя для вашей учетной записи Reddit.

Давайте создадим файл с именем Main.py, чтобы определить здесь наши логические функции. Давайте подтвердим это, запустив User Run для нашего приложения:

Теперь давайте определим функцию, с помощью которой можно будет проверить, является ли наше изображение форматом JPEG / PNG или нет. Это будет использоваться, чтобы проверить, является ли изображение, которое мы получаем, действительным изображением или нет:

Давай получим мем. Мы определим функцию, в которую мы передадим два параметра: sub, что означает субреддит, из которого мы хотим получить мемы, и count, что означает количество мемов, которое мы хотим получить. Теперь давайте определим функцию:

Мы получим заголовок, URL, голоса за, против, Reddit-URL и субреддит, добавим их к результату и вернем из функции. Мы определим аналогичную функцию для получения котировок также из субреддита и указанного счетчика:

Представление определяет самые популярные сообщения в конкретном Субреддите, а самотекст определяет Контент Markdown для конкретного Представления. Остальной код не требует пояснений, и вы можете поиграть с ним, прежде чем определять конечные точки API.

Давайте создадим API

Вернитесь к файлу app.py и давайте начнем с определения конечных точек REST API для нашего приложения. Удалите весь код, который мы написали ранее в нашем файле, так как мы начнем заново. Давайте сначала определим субреддиты, из которых мы хотим получить наши мемы и инициализировать наше приложение Flask, импортировав необходимые библиотеки и создав работающее приложение:

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

Давайте узнаем, что определим конечную точку, которая будет возвращаться как мем из случайного субреддита. Мы будем использовать функции get_meme() и check_image(), которые мы определили ранее в нашем Main.py файле, для получения случайных мемов. Мы возьмем заголовок, URL-адрес сообщения, голоса за / против, URL-адрес изображения и, наконец, субреддит, из которого был получен мем.

Теперь давайте определим маршрут, который возвращает нам мем из любого сабреддита по нашему выбору. Мы разместим наш код в блоке Try-Catch, чтобы гарантировать, что сообщение 404 будет возвращено, если в случае, если Subreddit не существует. Мы вернем все данные в виде JSON со случайным мемом из конкретного субреддита, из которого мы получаем данные.

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

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

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

Посмотрим, какие конечные точки мы реализовали до сих пор:

  1. / givememe: возвращает случайный мем из любого субреддита, который мы определили.
  2. / givememe / ‹sub›: возвращает мем из субреддита, указанного пользователем.
  3. / givememe / ‹int: c›: Возвращает количество мемов из любого субреддита, который мы определили.
  4. / givememe / sub / ‹int: c›: Возвращает количество мемов из субреддита, указанного пользователем.

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

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

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

Мы также определим маршрут 404, чтобы пользователь мог вернуться к сообщению об ошибке, если он направился на неуказанный URL.

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

Тестирование API

Теперь, когда мы построили все наши конечные точки API и определили в них логику, мы продолжим тестирование нашего API на всех подходящих конечных точках. Здесь я воспользуюсь Postman для тестирования конечных точек нашего API. Если вы не установили Postman, вы можете использовать свой браузер для тестирования всех наших конечных точек API.

Откройте инструмент командной строки и введите команду:

$ python app.py

Это запустит сервер через порт 5000. Откройте Postman и создайте новый запрос. Давайте вставим конечную точку API: http://localhost:5000/givememe, чтобы создать запрос:

Мы можем дополнительно поэкспериментировать с другими конечными точками, чтобы дополнительно изучить, как работает и функционирует наш API. Давайте проверим другую конечную точку API, чтобы получить 15 случайных мемов, передав: http://localhost:5000/givememe/15 для создания запроса:

При желании вы также можете протестировать эти конечные точки в своем браузере, и они отправят вам правильный ответ JSON. Теперь вы можете поэкспериментировать с этими конечными точками и настроить их в соответствии со своими потребностями и целями.

Заключение

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

Так, что дальше? С Flask вы можете дополнительно изучить разработку RESTful API и их развертывание в облачных службах, таких как Azure или Heroku. Вы можете начать изучение того, как с помощью Flask можно разработать масштабируемые функции, которые могут обрабатывать многочисленные запросы и многое другое. В отличие от Django или Ruby on Rails, которые автоматически генерируют несколько файлов после их настройки, Flask предоставляет вам гораздо больше функций и помогает вам точно определить, что вам здесь нужно.