Начиная с этого шага, мы будем создавать небольшой интернет магазин на FastAPI, который будет иметь несколько модулей, таких как функции входа в систему, категории товаров, товары и возможность оставление отзыва для товара. Для дальнейшего обслуживания и расширения проекта эти модули мы разместим в разные файлы проекта.
По аналогии с лекцией "HelloWorld на FastAPI" создадим новый проект с именем fastapi_ecommerce и создадим следующую структуру проекта:
├── app
│ ├── __init__.py
│ ├── main.py
│ └── routers
│ │ ├── __init__.py
│ │ ├── category.py
│ │ └── products.py
В нашем проекте мы создали папку app, где будет находиться наше приложение.
В этой папке мы создаем файл main.py. Это главный файл FastAPI приложения и в него мы будем импортировать все маршруты нашего приложения.
Также мы создали папку routers, которую поместили 2 файла: category.py и products.py. Эти файлы будут отвечать за маршрутизацию категорий товара и продуктов создавая необходимые конечные точки нашего API. Также у нас существует несколько файлов __init__.py: по одному в каждом каталоге или подкаталоге. Это то, что позволяет импортировать код из одного файла в другой, говоря что эта папка является пакетом Python.
До этого момента мы создавали CRUD проект используя только 1 файл и маршруты у нас находились в нем. Но чтобы вынести маршруты, вне главного файла приложения, нам необходимо воспользоваться экземпляром класса APIRouter из FastAPI.
Маршрутизация с помощью класса APIRouter
Класс APIRouter принадлежит пакету FastAPI и создает операции пути для нескольких маршрутов. Класс APIRouter поощряет модульность и организацию маршрутизации и логики приложений.
Методы маршрута создаются и распространяются из созданного экземпляра, создадим в файле category.py следующие маршруты:
from fastapi import APIRouter
router = APIRouter(prefix='/category', tags=['category'])
@router.get('/all_categories')
async def get_all_categories():
pass
@router.post('/create')
async def create_category():
pass
@router.put('/update_category')
async def update_category():
pass
@router.delete('/delete')
async def delete_category():
pass
Разберем данный код. Как вы можете видеть, вместо создания экземпляра класса FastAPI, мы создаем экземпляр класса APIRouter. Класс APIRouter, мы используем для группировки операций параметра пути /category .
И мы добавили следующие пути:
- Метод получения всех категорий
- Метод создания категории
- Метод изменения категории
- Метод удаления категории
Также вы должны уже заметить, что ранее мы использовали декораторы запросов как @app.get("/"), но сейчас же мы должны использовать их как @router.get('/all_categories'), так как теперь мы определяем маршруты и конечные точки предоставляемые классом APIRouter. Эти методы включают в себя router.get(), router.post(), router.put(), router.delete() и так далее, которые соответствуют различным методам HTTP-запроса.
Этот класс может принимать следующие параметры:
APIRouter(*, prefix='', tags=None, dependencies=None, default_response_class=Default(JSONResponse), responses=None, callbacks=None, routes=None, redirect_slashes=True, default=None, dependency_overrides_provider=None, route_class=APIRoute, on_startup=None, on_shutdown=None, lifespan=None, deprecated=None, include_in_schema=True, generate_unique_id_function=Default(generate_unique_id))
Мы добавили дополнительный префикс пути для маршрутизатора для группировки операций параметра пути /category, и также параметр tags, он отвечает за список тегов, которые будут применены ко всем операциям пути в этом маршрутизаторе, для группировки в документации.
В следующем шаге мы свяжем маршруты категорий с главным файлом нашего приложения.