Создаём простой API с Flask: пошаговое руководство для разработчиков

Узнайте, как создать полноценный RESTful API на Python с использованием Flask. Подробный гайд с примерами кода: CRUD операции, работа с базой данных, валидация, обработка ошибок и деплой.

РазработкаPython

6 мин

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

Что такое API и зачем он нужен

API (Application Programming Interface) — это набор правил и инструментов, которые позволяют различным программам взаимодействовать друг с другом. RESTful API использует HTTP-запросы для выполнения операций CRUD (Create, Read, Update, Delete) над данными. Современные веб-приложения часто разделяются на frontend и backend, где API служит мостом между ними.

Подготовка окружения

Прежде чем начать, нам нужно установить Flask. Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта:

python -m venv venv
source venv/bin/activate  # для Linux/Mac
venv\Scripts\activate  # для Windows
pip install flask

Создание базового API

Начнём с создания простейшего Flask-приложения. Создайте файл app.py:

from flask import Flask, jsonify, request

app = Flask(__name__)

# Временное хранилище данных
books = [
    {'id': 1, 'title': 'Чистый код', 'author': 'Роберт Мартин'},
    {'id': 2, 'title': 'Python. К вершинам мастерства', 'author': 'Лучано Рамальо'}
]

@app.route('/')
def home():
    return jsonify({'message': 'Добро пожаловать в API библиотеки!'})

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

Запустите приложение командой python app.py, и сервер станет доступен по адресу http://127.0.0.1:5000/.

Реализация CRUD операций

Теперь добавим endpoints для работы с книгами.

Получение всех книг (GET)

@app.route('/api/books', methods=['GET'])
def get_books():
    return jsonify({'books': books, 'count': len(books)})

Получение книги по ID (GET)

@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book:
        return jsonify(book)
    return jsonify({'error': 'Книга не найдена'}), 404

Создание новой книги (POST)

@app.route('/api/books', methods=['POST'])
def create_book():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Необходимо указать название книги'}), 400
    
    new_book = {
        'id': books[-1]['id'] + 1 if books else 1,
        'title': request.json['title'],
        'author': request.json.get('author', 'Неизвестный автор')
    }
    books.append(new_book)
    return jsonify(new_book), 201

Обновление книги (PUT)

@app.route('/api/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if not book:
        return jsonify({'error': 'Книга не найдена'}), 404
    
    book['title'] = request.json.get('title', book['title'])
    book['author'] = request.json.get('author', book['author'])
    return jsonify(book)

Удаление книги (DELETE)

@app.route('/api/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [book for book in books if book['id'] != book_id]
    return jsonify({'message': 'Книга удалена успешно'})

Обработка ошибок

Добавим обработчики ошибок для более информативных ответов:

@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'Ресурс не найден'}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({'error': 'Внутренняя ошибка сервера'}), 500

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

Для тестирования можно использовать curl, Postman или Python-библиотеку requests:

# Получить все книги
curl http://127.0.0.1:5000/api/books

# Создать новую книгу
curl -X POST http://127.0.0.1:5000/api/books \
  -H "Content-Type: application/json" \
  -d '{"title":"Совершенный код","author":"Стив Макконнелл"}'

# Обновить книгу
curl -X PUT http://127.0.0.1:5000/api/books/1 \
  -H "Content-Type: application/json" \
  -d '{"title":"Чистый код (новое издание)"}'

# Удалить книгу
curl -X DELETE http://127.0.0.1:5000/api/books/2

Добавление валидации

Для более надёжной валидации данных можно использовать библиотеку flask-marshmallow:

from flask_marshmallow import Marshmallow

ma = Marshmallow(app)

class BookSchema(ma.Schema):
    class Meta:
        fields = ('id', 'title', 'author')

book_schema = BookSchema()
books_schema = BookSchema(many=True)

Подключение базы данных

Для реальных приложений стоит использовать базу данных. Установим Flask-SQLAlchemy:

pip install flask-sqlalchemy

Пример модели книги с SQLAlchemy:

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///books.db'
db = SQLAlchemy(app)

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    author = db.Column(db.String(100))
    
    def to_dict(self):
        return {
            'id': self.id,
            'title': self.title,
            'author': self.author
        }

Добавление CORS

Если ваш API будет использоваться frontend-приложением, нужно настроить CORS:

pip install flask-cors
from flask_cors import CORS

CORS(app)

Безопасность и лучшие практики

При разработке API важно помнить о безопасности. Используйте переменные окружения для хранения конфиденциальных данных, реализуйте аутентификацию через JWT-токены, ограничивайте количество запросов (rate limiting), валидируйте все входящие данные и используйте HTTPS в продакшене.

Также рекомендуется организовать структуру проекта, разделив код на модули: создайте отдельные файлы для моделей, routes и конфигурации. Используйте Blueprint для группировки связанных endpoints, что делает код более maintainable и масштабируемым.

Деплой API

Для развертывания Flask-приложения в продакшене используйте WSGI-сервер, такой как Gunicorn:

pip install gunicorn
gunicorn -w 4 app:app

Популярные платформы для деплоя: Heroku, DigitalOcean, AWS, или традиционный VPS с nginx в качестве reverse proxy.

Заключение

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

Хотите глубже разобраться в Python и веб-разработке?

Приложение Кодик предлагает структурированные курсы по Python, JavaScript, работе с API и многим другим технологиям. Обучение построено на практических примерах с пошаговыми объяснениями.

Присоединяйтесь к нашему Telegram-каналу, где вы найдёте полезные материалы, советы по программированию и поддержку активного сообщества разработчиков, готовых помочь на любом этапе вашего обучения!

Комментарии