Создаём простой API с Flask: пошаговое руководство для разработчиков
Узнайте, как создать полноценный RESTful API на Python с использованием Flask. Подробный гайд с примерами кода: CRUD операции, работа с базой данных, валидация, обработка ошибок и деплой.
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-corsfrom 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-каналу, где вы найдёте полезные материалы, советы по программированию и поддержку активного сообщества разработчиков, готовых помочь на любом этапе вашего обучения!