В мире современной веб-разработки эффективность и скорость играют ключевую роль. Python, благодаря своей универсальности и простоте использования, стал стандартом в разработке веб-приложений. FastAPI, современный и быстрый (высокопроизводительный) веб-фреймворк для создания API на Python 3.7+ на основе стандартных подсказок типов Python, приносит на передний план мощь асинхронного программирования. Когда речь идет об управлении данными на бэкенде, SQLite блеснет как легкая и эффективная система управления реляционными базами данных. В этой статье мы погрузимся в тонкости создания веб-приложения, работающего с данными, с использованием Python, FastAPI и SQLite.
Настройка окружения
Перед тем как приступить к написанию кода, убедитесь, что у вас установлен Python и pip на вашей системе. Вы можете установить библиотеки FastAPI и SQLite с помощью pip:
pip install fastapi uvicorn sqlalchemy databases[sqlite]
Создание приложения на FastAPI
Давайте начнем с создания базового приложения FastAPI, которое взаимодействует с SQLite. Мы определим конечные точки для выполнения операций CRUD (Create, Read, Update, Delete) над нашими данными.
from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String, MetaData, Table from databases import Database # Подключение к базе данных SQLite DATABASE_URL = "sqlite:///./test.db" database = Database(DATABASE_URL) metadata = MetaData() # Определение схемы таблицы notes = Table( "notes", metadata, Column("id", Integer, primary_key=True), Column("title", String(50)), Column("content", String(200)), ) # Создание экземпляра FastAPI app = FastAPI() @app.on_event("startup") async def startup(): await database.connect() @app.on_event("shutdown") async def shutdown(): await database.disconnect() # Определение операций CRUD @app.get("/notes/{note_id}") async def read_note(note_id: int): query = notes.select().where(notes.c.id == note_id) return await database.fetch_one(query) @app.post("/notes/") async def create_note(title: str, content: str): query = notes.insert().values(title=title, content=content) return await database.execute(query) @app.put("/notes/{note_id}") async def update_note(note_id: int, title: str, content: str): query = notes.update().where(notes.c.id == note_id).values(title=title, content=content) return await database.execute(query) @app.delete("/notes/{note_id}") async def delete_note(note_id: int): query = notes.delete().where(notes.c.id == note_id) return await database.execute(query)
Запуск приложения
Чтобы запустить приложение FastAPI, выполните следующую команду:
uvicorn main:app --reload
Теперь вы можете получить доступ к документации API по адресу http://localhost:8000/docs и протестировать операции CRUD.
Использование миграций для управления БД
При разработке приложений, особенно если они будут масштабироваться, важно иметь управление версиями базы данных. Для этого мы можем использовать инструмент миграции базы данных, такой как Alembic. Давайте настроим Alembic для нашего проекта.
pip install alembic
Сначала нам нужно создать скрипт миграции:
alembic init alembic
Затем мы можем определить нашу базовую модель в файле models.py:
from sqlalchemy import MetaData, Table, Column, Integer, String metadata = MetaData() notes = Table( "notes", metadata, Column("id", Integer, primary_key=True), Column("title", String(50)), Column("content", String(200)), )
Теперь, когда у нас есть наша базовая модель, мы можем создать скрипт миграции:
alembic revision --autogenerate -m "create notes table"
Это создаст скрипт миграции, который автоматически определит необходимые изменения в базе данных для создания таблицы notes.
Использование Pydantic для валидации
FastAPI поддерживает автоматическую валидацию запросов с использованием моделей Pydantic. Мы можем использовать Pydantic для валидации и сериализации данных, поступающих в наше приложение.
Давайте определим модели Pydantic для наших заметок в файле schemas.py:
from pydantic import BaseModel class NoteCreate(BaseModel): title: str content: str class NoteUpdate(BaseModel): title: str content: str
Теперь мы можем использовать эти модели для валидации данных в наших эндпоинтах:
from fastapi import FastAPI from .schemas import NoteCreate, NoteUpdate @app.post("/notes/") async def create_note(note: NoteCreate): ... @app.put("/notes/{note_id}") async def update_note(note_id: int, note: NoteUpdate): ...
Внедрение аутентификации и авторизации
Безопасность является важным аспектом приложений. FastAPI облегчает внедрение аутентификации и авторизации. Мы можем использовать различные методы аутентификации, такие как JWT (JSON Web Tokens), OAuth2 и многие другие.
Внедрение документации API
FastAPI генерирует автоматическую интерактивную документацию API на основе аннотаций Python в коде. Однако мы также можем дополнительно расширить эту документацию с помощью дополнительных инструментов, таких как Swagger UI или ReDoc.
Тестирование кода
Важным шагом в разработке любого приложения является тестирование. Мы можем написать автоматические тесты для наших эндпоинтов, чтобы убедиться, что они работают как ожидается.
Заключение
В этом учебнике мы изучили интеграцию FastAPI с SQLite для создания надежного и эффективного веб-приложения, работающего с данными на Python. Асинхронные возможности FastAPI в сочетании с легковесной природой SQLite делают их привлекательным выбором для разработки высокопроизводительных API. С помощью среды разработки Python разработчики могут легко создавать масштабируемые и поддерживаемые веб-приложения.