-
Notifications
You must be signed in to change notification settings - Fork 0
Developer's
Это руководство предназначено для разработчиков, которые хотят внести свой вклад в проект системы заявок на ремонт техники или расширить его функциональность.
ticket-system/
├── alembic/ # Миграции базы данных
│ ├── versions/ # Версии миграций
│ ├── env.py # Окружение Alembic
│ └── alembic.ini # Конфигурация Alembic
├── app/ # Основной код приложения
│ ├── api/ # API эндпоинты
│ │ ├── deps.py # Зависимости для API (авторизация и т.д.)
│ │ ├── endpoints/ # Обработчики API эндпоинтов
│ │ └── router.py # Маршрутизация API
│ ├── core/ # Ядро приложения
│ │ ├── config.py # Конфигурация приложения
│ │ └── security.py # Функции безопасности (JWT, пароли)
│ ├── db/ # Работа с базой данных
│ │ ├── base_class.py # Базовый класс для моделей
│ │ └── database.py # Настройка подключения к БД
│ ├── models/ # Модели SQLAlchemy
│ │ ├── models.py # Модель пользователя
│ │ └── ticket.py # Модели заявок и комментариев
│ ├── schemas/ # Схемы Pydantic
│ │ ├── comment.py # Схемы для комментариев
│ │ ├── schemas.py # Общие схемы
│ │ ├── ticket.py # Схемы для заявок
│ │ └── user.py # Схемы для пользователей
│ ├── initial_data.py # Скрипт для создания начальных данных
│ └── main.py # Точка входа в приложение
├── tests/ # Тесты
│ ├── conftest.py # Конфигурация тестов
│ ├── test_auth.py # Тесты аутентификации
│ ├── test_comments.py # Тесты комментариев
│ ├── test_tickets.py # Тесты заявок
│ └── test_users.py # Тесты пользователей
├── .env # Переменные окружения (не в репозитории)
├── .gitignore # Игнорируемые файлы Git
├── requirements.txt # Зависимости проекта
└── README.md # Описание проекта
Для обеспечения качества кода рекомендуется настроить pre-commit хуки:
-
Установите pre-commit:
pip install pre-commit
-
Создайте файл
.pre-commit-config.yamlв корне проекта:repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: - id: isort - repo: https://github.com/pycqa/flake8 rev: 6.0.0 hooks: - id: flake8 additional_dependencies: [flake8-docstrings] - repo: https://github.com/psf/black rev: 23.3.0 hooks: - id: black
-
Инициализируйте pre-commit:
pre-commit install
Для поддержания единого стиля кода рекомендуется использовать:
-
Black - форматтер кода:
pip install black
-
isort - сортировка импортов:
pip install isort
-
flake8 - линтер:
pip install flake8
Создайте файл setup.cfg для настройки линтеров:
[flake8]
max-line-length = 88
extend-ignore = E203
exclude = .git,__pycache__,build,dist,venv,alembic
[isort]
profile = black
line_length = 88-
Создайте новую ветку от
main:git checkout -b feature/your-feature-name
-
Внесите необходимые изменения в код.
-
Если изменения затрагивают модели данных, создайте миграцию:
alembic revision --autogenerate -m "Description of changes" -
Напишите тесты для новой функциональности.
-
Запустите тесты:
pytest -v
-
Отформатируйте код:
black app tests isort app tests
-
Создайте коммит и отправьте изменения:
git add . git commit -m "Add your feature description" git push origin feature/your-feature-name
-
Создайте Pull Request в GitHub.
-
Создайте новую ветку от
main:git checkout -b fix/bug-description
-
Внесите необходимые исправления.
-
Добавьте тест, воспроизводящий ошибку.
-
Убедитесь, что тесты проходят:
pytest -v
-
Создайте коммит и отправьте изменения:
git add . git commit -m "Fix bug description" git push origin fix/bug-description
-
Создайте Pull Request в GitHub.
-
Создайте новый файл в директории
app/api/endpoints/или добавьте функцию в существующий файл. -
Определите функцию-обработчик с декоратором маршрута:
from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.api import deps from app.models import models from app.schemas import schemas router = APIRouter() @router.get("/{item_id}", response_model=schemas.ItemResponse) def read_item( item_id: int, db: Session = Depends(deps.get_db), current_user: models.User = Depends(deps.get_current_user), ): # Логика обработки запроса return item
-
Добавьте маршрут в
app/api/router.py:from app.api.endpoints import items api_router.include_router( items.router, prefix="/items", tags=["items"] )
-
Добавьте схемы Pydantic в директорию
app/schemas/. -
Напишите тесты для нового эндпоинта.
-
Создайте новую модель в директории
app/models/:from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from app.db.base_class import Base class Item(Base): __tablename__ = "items" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True) description = Column(String) owner_id = Column(Integer, ForeignKey("users.id")) owner = relationship("User", back_populates="items")
-
Добавьте связь в существующие модели, если необходимо:
# В модели User items = relationship("Item", back_populates="owner")
-
Создайте схемы Pydantic в директории
app/schemas/:from pydantic import BaseModel, ConfigDict class ItemBase(BaseModel): name: str description: str = None class ItemCreate(ItemBase): pass class ItemUpdate(BaseModel): name: str = None description: str = None class ItemResponse(ItemBase): id: int owner_id: int model_config = ConfigDict(from_attributes=True)
-
Создайте миграцию:
alembic revision --autogenerate -m "Add Item model" -
Примените миграцию:
alembic upgrade head
-
Создайте API эндпоинты для работы с новой моделью.
-
Напишите тесты для новой модели и эндпоинтов.
Для отладки используйте логирование:
import logging
logger = logging.getLogger(__name__)
def some_function():
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")Для отладки тестов используйте флаг -s:
pytest -s tests/test_specific_file.py::test_specific_functionДля интерактивной отладки используйте pdb:
import pdb
def some_function():
# Код
pdb.set_trace() # Точка останова
# Продолжение кода-
Используйте индексы для часто запрашиваемых полей.
-
Оптимизируйте запросы - используйте
select_from,joinиoptionsдля уменьшения количества запросов. -
Пагинация - всегда используйте пагинацию для больших наборов данных:
@router.get("/", response_model=List[schemas.ItemResponse]) def read_items( skip: int = 0, limit: int = 100, db: Session = Depends(deps.get_db), ): items = db.query(models.Item).offset(skip).limit(limit).all() return items
-
Кэширование - для часто запрашиваемых данных используйте кэширование (Redis, Memcached).
-
Не храните секреты в коде - используйте переменные окружения.
-
Валидируйте входные данные - используйте Pydantic для валидации.
-
Проверяйте права доступа - всегда проверяйте, имеет ли пользователь права на выполнение операции.
-
Используйте HTTPS - в продакшене всегда используйте HTTPS.
-
Ограничивайте частоту запросов - используйте rate limiting для предотвращения DoS-атак.