В данной контрольной точке вам предстоит разработать API сервиса обмена снами. Вдохновением выступил известный в нулевые года "цитатник рунета". Там не было возможности оставлять комментарии, можно было лишь менять рейтинг, то есть функционал достаточно простой, подходящий для обучения. Здесь вас ждет примерно то же, только вместо рейтинга будут лайки, а вместо цитат - сны пользователей.
В этой контрольной точке есть два уровня сложности: базовый (до 17 баллов) и сложный (до 25 баллов). Из базового уровня исключены отношения многие-ко-многим, функционал лайков и биографии пользователя. Выбирая сложный уровень, будьте готовы, что за простые задания вы получите чуть меньше баллов, а добирать их придётся изучая документацию, блоги, ютюб и гитхаб.
Если вы выбрали базовый уровень, переключитесь на ветку basic, создайте от нее свою ветку с фамилией и работайте в ней. Аналогично для ветки full.
git switch <basic/full-выбери-меня>
git switch -c <фамилия-измени-меня>| Задание | Критерий приемки | Балл |
|---|---|---|
| 1. Регистрация | pytest, postman | |
| 1.1 Реализована регистрация с корректными данными | 1 | |
| 1.2 Реализована обработка некорректных входных данных и дубликатов | 1 | |
| 2. Логин | pytest, postman | |
| 2.1 Реализован логин с корректными данными | 1 | |
| 2.2 Реализована обработка некорректных данных | 1 | |
| 3. Пользователи | pytest, postman | |
| 3.1 Залогиненный пользователь получает информацию о себе | 1 | |
| 3.2 Гость не может получить информацию | 1 | |
| 4. Чтение снов | pytest, postman | |
| 4.1 Реализован пагинированный вывод списка снов | 1 | |
| 4.2 Реализована фильтрация по автору | 1 | |
| 4.3 Реализовано получение сна по идентификатору, обработка несуществующего идентификатора | 1 | |
| 5. Создание снов | pytest, postman | |
| 5.1 Залогиненный пользователь может создавать новые сны | 1 | |
| 5.2 Гость не может создавать новые сны | 1 | |
| 5.3 Реализована обработка некорректных данных и дубликатов | 1 | |
| 6. Удаление снов | pytest, postman | |
| 6.1 Залогиненный пользователь может удалять свои сны | 1 | |
| 6.2 Залогиненный пользователь не может удалять чужие сны | 1 | |
| 6.3 Гость не может удалять сны | 1 | |
| 6.4 Реализована обработка некорректных данных | 1 |
- плюс 1 балл за форматирование, отсутствие ошибок линтера и форматтера
- минус 1 балл в случае отправки ответа не через гитхаб
| Задание | Критерий приемки | Балл |
|---|---|---|
| 1. Аутентификация и пользовательская модель | pytest, postman |
|
| 1.1 Реализована регистрация с корректными данными, есть обработка плохих случаев | 1 | |
| 1.2 Реализован логин с корректными данными, есть обработка плохих случаев | 1 | |
| 1.3 Залогиненный пользователь получает информацию о себе, гость не может получить информацию | 1 | |
| 1.4 Залогиненный пользователь может обновлять информацию о себе | 1 | |
| 2. Сны | pytest, postman |
|
| 2.1 Реализован пагинированный вывод списка снов с фильтрацией по автору и поиском по описанию | 2 | |
| 2.2 Реализован вывод любимых снов пользователя | 1 | |
| 2.3 Реализовано получение сна по идентификатору, есть обработка плохих случаев | 1 | |
| 2.4 Залогиненный пользователь может создавать новые сны, гость не может создавать новые сны, есть обработка плохих случаев | 1 | |
| 2.5 Залогиненный пользователь может удалять свои сны, есть обработка плохих случаев | 1 | |
| 2.6 Залогиненный пользователь не может удалять чужие сны; гость не может удалять сны | 1 | |
| 2.7 Залогиненный пользователь может добавлять сны в любимые, удалять сны из любимых, есть обработка плохих случаев | 2 | |
| 3. Дополнительный функционал | ручная проверка | |
| 3.1 Реализована ролевая модель (пользователь / суперпользователь) | 2 | |
| 3.2 Реализована и внедрена (где требуется) зависимость для проверки роли | 1 | |
| 3.3 Суперпользователь может удалять любые сны | 1 | |
| 3.4 Любой иной ролевый функционал на ваш выбор | 1 | |
| 4. Тестирование | ручная проверка | |
4.1 Для пункта 3.3 написаны api-тесты на pytest, дополнены фикстуры |
1 | |
4.2 Для пункта 3.3 создан документ в коллекции postman, написаны тесты |
1 | |
| 5. Архитектура | ручная проверка | |
| 5.1 Изучите лучшие практики работы с FastAPI, используя блоги, ютюб и популярные репозитории гитхаба. Вам могут встретиться различные архитектурные подходы, например, "чистая архитектура" или "domain-driven design". Выберите источник вдохновения и интегрируйте идеи в этот проект (лучше в отдельной ветке для экспериментов). Если не найдется ничего достойного, можете (а) выделить дополнительный слой "репозиторий", куда вынести непосредственную работу через курсор и сессии, а очищенные сервисы выделите в зависимости, (б) попробовать библиотеки для реализации полноценного dependency injection | 4 |
- плюс 1 балл за форматирование, отсутствие ошибок линтера и форматтера
- минус 1 балл в случае отправки ответа не через гитхаб
Есть два пути: uv-way и old-way. Если есть проблемы с установкой библиотек, выбирайте old-way. Если у вас есть проблемы с uv - также выбирайте old-way. Иначе - выбирайте uv-way.
# windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"# unix
curl -LsSf https://astral.sh/uv/install.sh | shПерезапустите терминал (либо редактор кода), проверьте работоспособность
# windows / unix
uvЕсли uv откликнулся, продолжайте двигаться по пути. Иначе переходите на old-way.
Удалите директорию venv, выполните следующие команды
# windows / unix
uv sync # установка зависимостей
uv venv # активация виртуального окруженияПеременные окружения служат для задания конфигураций и чувствительных данных. В этом проекте к ним относятся путь к файловой базе данных, соли для хеширования и шифрования, а также флаг для режима отладки. Чтобы разработчик знал, какие именно поля ему нужно заполнить, обычно в репозитории находится файл с примером, здесь это .env.example.
Скопируйте его содержимое в файлы .env.local и .env.testing следующими командами
# windows
copy .env.example .env.local # создание файла для окружения разработки
copy .env.example .env.testing # создание файла для окружения тестирования# unix
cp .env.example .env.local # создание файла для окружения разработки
cp .env.example .env.testing # создание файла для окружения тестированияТеперь внесите в созданные файлы настройки для DATABASE_URI, JWT_SECRET_KEY, PASSWORD_SALT, DEBUG.
Рекомендации:
- используйте разные
DATABASE_URIдля окружений разработки и тестирования; JWT_SECRET_KEYиPASSWORD_SALTгенерируйте командой, указанной в.env.example(подwindowsона будет работать черезgit bash);- флаг
DEBUGустановите вtrueдля окружения разработки, вfalseдля окружения тестирования.
# windows / unix
uv run python -m app.database.seed# windows / unix
uv run uvicorn app.main:app --reloadДобро пожаловать в документацию по ссылке http://localhost:8000/docs!
Создайте виртуальное окружение (если редактор кода не создал его автоматически).
# windows
python -m venv .venv# unix
python3 -m venv .venvАктивируйте его
# windows
.venv\Scripts\activate# unix
source .venv\bin\activateУстановите зависимости
# windows
(.venv) pip install -r requirements.txt# unix
(.venv) python3-pip install -r requirements.txtЕсли наблюдаются проблемы со скачиванием библиотек и вы не знаете / не можете их обойти, скопируйте содержимое директории site-packages в .venv\Lib\site-packages на Windows либо .venv\lib\...\site-packages на Unix.
Переменные окружения служат для задания конфигураций и чувствительных данных. В этом проекте к ним относятся соли для хеширования и шифрования. Чтобы разработчик знал, какие именно поля ему нужно заполнить, обычно в репозитории находится файл с примером, здесь это .env.example.
Скопируйте его содержимое в файл .env следующей командой
# windows
(.venv) copy .env.example .env# unix
(.venv) cp .env.example .envТеперь внесите в созданные файлы настройки для JWT_SECRET_KEY и PASSWORD_SALT. Генерируйте их командой, указанной в .env.example (под windows она будет работать через git bash).
# windows
(.venv) python -m app.database.seed
# unix
(.venv) python3 -m app.database.seed# windows / unix
(.venv) fastapi devЕсли сервер не запустился, попробуйте альтернативную команду
# windows
(.venv) py -m fastapi dev# unix
(.venv) python3 -m fastapi devДобро пожаловать в документацию по ссылке http://localhost:8000/docs!
# windows / unix
npx newman run postman_collection.json --global-var "API_URL=http://127.0.0.1:8000" --global-var="USERNAME=john.doe" --global-var="PASSWORD=password"# uv-way
pytest
# old-way
uv run pytest# uv-way
uv run ruff format app
# old-way
ruff format app# uv-way
uv run ruff check app
# old-way
ruff check app# uv-way
uv run mypy app
# old-way
mypy app