Начните создавать серверные сервисы с помощью Python

Фон

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

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

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

Технологии

В этой статье мы будем использовать Flask: Веб-разработка по капле за раз. Flask - это библиотека веб-разработки, построенная на Python.

Flask использует простоту Python в качестве подхода для новичков, который позволяет легко приступить к созданию базового приложения для сложных серверных API и микросервисов, которые обслуживают миллионы пользователей. Flask используется такими техническими гигантами, как Netflix, Reddit, Lyft и другими.

Для IDE я буду использовать Visual Studio Code. Я настоятельно рекомендую вам использовать это, это бесплатно с потрясающей экосистемой плагинов, которая сделает вашу разработку Python радостью. Для тестирования наших конечных точек API мы будем использовать Почтальон, вы можете скачать его бесплатно.

Примечание

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

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

Определения

Определение API

Интерфейс прикладного программирования - это компьютерный интерфейс для программного компонента или системы, который определяет, как другие компоненты или системы могут его использовать. Он определяет виды вызовов или запросов, которые могут быть сделаны, как их делать, форматы данных, которые следует использовать, соглашения, которым нужно следовать, и т. Д. - Википедия

Определение JSON

Нотация объектов JavaScript - это открытый стандартный формат файла и формат обмена данными, в котором используется читаемый человеком текст для хранения и передачи объектов данных, состоящих из пар атрибут-значение и типов данных массива. - Википедия

Определение HTTP

«HTTP определяет набор методов запроса, чтобы указать желаемое действие, которое должно быть выполнено для данного ресурса. Хотя они также могут быть существительными, эти методы запроса иногда называют HTTP-глаголами.

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

GET

Метод GET запрашивает представление указанного ресурса. Запросы с использованием GET должны только получать данные.

POST

Метод POST используется для отправки объекта указанному ресурсу, часто вызывая изменение состояния или побочные эффекты на сервере.

PUT

Метод PUT заменяет все текущие представления целевого ресурса полезными данными запроса.

DELETE

Метод DELETE удаляет указанный ресурс. CONNECT.

PATCH

Метод PATCH используется для частичного изменения ресурса.

Что мы собираемся построить

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

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

Начиная

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

Создайте новый каталог и перейдите во вновь созданный каталог. Я назвал свой «aa-api», вы можете называть свой как хотите.

mkdir aa-api
cd aa-api

Установить Pipenv

«Pipenv - это инструмент, целью которого является привнести в мир Python все лучшее из мира упаковки (сборщик, композитор, npm, cargo, yarn и т. Д.). Windows - это первоклассный гражданин в нашем мире.

Он автоматически создает виртуальный каталог для ваших проектов и управляет им, а также добавляет / удаляет пакеты из вашего Pipfile по мере того, как вы устанавливаете / удаляете пакеты. Он также генерирует всегда важный Pipfile.lock, который используется для создания детерминированных сборок ».

pip install --user pipenv

Установить Flask

Как я уже упоминал в разделе технологий выше, мы собираемся использовать Flask, минималистичную библиотеку Python для создания веб-приложений. Мы будем использовать Pipenv для установки Flask.

pipenv install flask

Это создаст виртуальную среду и установит Flask. Он сгенерирует для нас два файла: Pipfile и Pipfile.lock. Если у вас есть некоторый опыт работы с Node.js, он похож на файл Package.json или на Ruby Gemfile.

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
flask = "*"
[requires]
python_version = "3.8"

API Flask «Hello Universe» в шести строках кода.

Итак, вот и все, наш самый первый API всего из шести строк кода, вот какой классный Flask. Если вы знакомы с Python, большая часть этого кода будет вам знакома.

Может, @app.route('/) будет немного не по себе. В Python это называется декораторами, и эта концепция также доступна в других языках программирования, поэтому она не свойственна Python.

Декораторы берут на себя функцию и расширяют ее функциональность для нашей hello функции, она будет вызываться при запросе маршрута / и возвращать JSON {"hello": "Universe"}.

Я помещу ссылку после этой статьи, чтобы узнать больше о декораторах в Python, хотя это не является обязательным требованием для этой статьи. Flask уже сделал за нас тяжелую работу.

Запуск нашего приложения

Чтобы запустить наше приложение, нам сначала нужно активировать виртуальную среду, созданную для нас Pipenv, запустив pipenv shell.

➜  aa-api pipenv shell 
Launching subshell in virtual environment…
 . /Users/peterayeni/.local/share/virtualenvs/aa-api-9L89IsJh/bin/activate
➜  aa-api  . /Users/peterayeni/.local/share/virtualenvs/aa-api-9L89IsJh/bin/activate
(aa-api) ➜  aa-api

Затем запускаем python app.py.

(aa-api) ➜  aa-api python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Вы увидите, что сервер разработки теперь работает на нашем локальном хосте на порту 5000. Запустите Postman и создайте запрос GET.

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

Здесь обретет смысл определение приведенных выше HTTP-глаголов. По умолчанию наша hello функция делает запрос GET к корневому маршруту "/", вы можете увидеть возвращенный JSON в Postman выше.

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

Данные шины

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

Number Plate
Manufacturer
Model
Year
Capacity

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

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

Выше я внес несколько изменений в наш код, добавив коллекцию bus и внес несколько изменений в функцию.

Наша функция hello теперь переименована в get_buses. Название дает нам представление о функциональности функции, она достанет нам все автобусы в нашей коллекции.

Чтобы увидеть результат нашей работы, нам нужно перезапустить сервер с использованием ctr+ c и python app.py.

Получите один автобус

Теперь давайте создадим еще одну конечную точку, которая получает только одну шину.

Выше мы добавили новую конечную точку, чтобы получить единственную шину.

Мы захватили индекс шины, которую мы хотели получить через URL '/buses/<int:index>', поэтому в нашем URL мы можем иметь http://127.0.0.1:5000/buses/1, а 1 будет передано в функцию get_bus, которая будет использоваться для получения шины в этом расположение нашего массива buses и верните его нам.

Добавить новый автобус

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

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

Первое, что бросится вам в глаза, это то, что наш @app.route принимает второй аргумент, называемый methods, который определяет тип ожидаемого HTTP-метода.

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

Вы также заметите, что на этот раз мы возвращаем идентификатор только что добавленной шины, идентификатор - это просто размер списка и код состояния 200, чтобы показать, что ресурс был успешно создан.

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

Обновить и удалить

Как видите, обновление и удаление следуют аналогичным схемам. Для обновления используем HTTP-метод PUT, содержимое обновления мы получаем через метод запроса. Мы знаем, какие данные нужно обновить, передавая их через URL-адрес, как мы это делаем для получения единственной шины.

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

Вы заметите, что мы используем jsonify(), метод из Flask для преобразования словаря Python в JSON, который затем отправляем пользователю.

Полный код

Вот и весь код, необходимый для развертывания полноценного CRUD API в Python с помощью Flask.

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

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

Ресурсы

Удачного кодирования!