Как создать REST API с Flask на Ubuntu

Введение

В этом руководстве вы узнаете, как создать простую REST API с использованием Flask, легкого веб-фреймворка на Python. Мы покроем основы установки приложения Flask, определения маршрутов, обработки запросов и возвращения JSON-ответов. By the end of this tutorial, you will have a working API that you can extend and integrate with other applications.

Предупреждения

  • Сервер, выполняющий Ubuntu, и пользователь с правами sudo и активной firewall. Чтобы получить инструкции по установке, пожалуйста выберите свою дистрибутив из этого списка и следуйте нашему руководству по настройке начального сервера. Убедитесь, что работаете с поддерживаемой версией Ubuntu.

  • Знакомство с командной строкой Linux. Для введения или обновления знаний о командной строке вы можете просмотреть это руководство Linux command line primer

  • Основные знания по программированию на Python.

  • Python 3.7 или более высокая версия установлена на вашей системе Ubuntu. Чтобы узнать, как запустить сценарий Python на Ubuntu, вы можете обратиться к нашему учебнику Как запустить сценарий Python на Ubuntu.

Step 1 — Setting Up Your Flask Environment

Ubuntu 24.04 поставляется с Python 3 по умолчанию. Откройте терминал и выполните следующий приказ, чтобы убедиться в установке Python 3:

root@ubuntu:~# python3 --version
Python 3.12.3

Если Python 3 уже установлен на вашей машине, этот приказ вернёт текущую версию установки Python 3. Если он не установлен, вы можете выполнить следующий приказ и установить Python 3:

root@ubuntu:~# sudo apt install python3

Далее вам необходимо установить installeр пакетов pip на вашей системе:

root@ubuntu:~# sudo apt install python3-pip

一旦 pip установлен, далее мы установим Flask.

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

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate
root@ubuntu:~# pip install Flask

Шаг 2 — Создание приложения Flask

Следующий шаг — написание Python-кода для приложения Flask. Чтобы создать новый скрипт, перейдите в выбранный вами каталог:

root@ubuntu:~# cd ~/путь-к-каталогу-с-скриптами

Внутри каталога создайте новый Python-файл, app.py, и импортируйте Flask. Затем инициализируйте Flask-приложение и создайте базовый маршрут.

root@ubuntu:~# nano app.py

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

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# В-Memoria хранение данных
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

Шаг 3 — Создание RESTful маршрутов

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

GET, POST, PUT, и DELETE. Эти методы соответствуют четырём основным операциям持久的存储—часто обозначаемым как CRUD (Create, Read, Update, Delete).

Добавьте следующие маршруты в ваш скрипт Python app.py:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# GET request: Retrieve all items
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# GET request: Retrieve a specific item by ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# POST request: Create a new item
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# PUT request: Update an existing item
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# DELETE request: Delete an item
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

if __name__ == "__main__":
    app.run(debug=True)

Узнайте больше о том, что делает каждая функция:

  • Flask Imports: The code imports necessary components from Flask: Flask, jsonify, and request.

  • In-Memory Data Store: items is a simple list of dictionaries that acts as a temporary data store for the API. Each item has an id and a name.

  • GET /api/items: При выполнении запроса GET к /api/items сервер возвращает список всех элементов из хранилища данных элементов. Это полезно для извлечения всех ресурсов в коллекции.

  • POST /api/items: Запрос POST к /api/items позволяет клиенту создать новый элемент. Сервер ожидает JSON-объект, содержащий детали нового элемента, в теле запроса. После создания элемента сервер отвечает созданным элементом и кодом статуса 201 Created.

  • PUT /api/items/<int:item_id>: Запрос PUT к /api/items/<item_id> используется для обновления существующего элемента с указанным item_id. Клиент посылает обновленные данные в теле запроса, и сервер модифицирует существующий элемент. Если элемент не найден, сервер возвращает ошибку 404 Not Found.

  • DELETE /api/items/<int:item_id>: Запрос DELETE к /api/items/<item_id> удаляет элемент с указанным item_id из хранилища данных. Если элемент успешно удален, сервер отвечает с кодом состояния 204 No Content, что указывает на успешное удаление и отсутствие дальнейшего содержимого для возврата.

  • Запуск приложения: Блок if __name__ == "__main__": гарантирует, что приложение Flask запустится при непосредственном выполнении скрипта.

шаг 4 — запуск и тестирование API

Запустите сервер Flask следующим образом:

root@ubuntu:~# python3 app.py

Вы должны увидеть, что Flask сервер запущен следующим выводом:

Output
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-877-972

Согласно вышедшему выводу вы можете заметить, что сервер запущен на http://127.0.0.1 и выполняет прослушивание на порте 5000.

Теперь вы можете тестировать endpoint с использованием curl, Postman или другого HTTP-клиента. В этом учебнике вы будете использовать curl, чтобы тестировать endpoint и отправлять HTTP-запросы.

Откройте другой консоль Ubuntu и выполните одну за другой следующие команды curl:

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

Посмотрим, каждая из этих команд действует:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 1, "name": "This is item 1" }, { "id": 2, "name": "This is item 2" } ]

Вы заметите, что сервер возвращает список всех элементов в элементах базе данных.

Используя метод POST, добавим новый элемент в базу данных.

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
Output
{ "id": 3, "name": "This is item 3" }

Примечание: На вашем другом консоле, где запущен Flask сервер, вы заметите все выполненные HTTP-запросы и их коды ответа тоже.

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

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

next, let’s execute a PUT request. A PUT request to /api/items/<item_id> will update an existing item with the specified item_id.

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Now, let’s execute a GET request to see the updated item 1.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Finally, let’s execute a DELETE request to delete an item from the datastore.

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

This will delete item 1 from the data store.

To verify this, let’s execute a GET request.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

Вы заметите, что элемент 1 уже не присутствует и был永久но удалён.

Заключение

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

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu