CRUD API со следующими сущностями: User, News, Comment. Новости могут создавать только верифицированные пользователи. Есть миграции на создание таблиц и на загрузку мок-данных.
docker compose up -d dbpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # при необходимости отредактируйте DATABASE_URLalembic upgrade headuvicorn app.main:app --reload
# сервис слушает http://127.0.0.1:8000- User (1) ——< News (многие), каскадное удаление News при удалении автора
- User (1) ——< Comment (многие)
- News (1) ——< Comment (многие), каскадное удаление Comment при удалении News
Поля:
- User:
id, name, email (unique), registered_at, is_verified_author, avatar_url - News:
id, title, content (JSON), published_at, author_id (FK users.id), cover_url - Comment:
id, text, published_at, news_id (FK news.id), author_id (FK users.id)
curl -s http://127.0.0.1:8000/pingСоздать пользователя:
curl -s -X POST http://127.0.0.1:8000/users/ -H "Content-Type: application/json" -d '{
"name": "Alice",
"email": "alice2@example.com",
"is_verified_author": true,
"avatar_url": null
}'Список пользователей:
curl -s http://127.0.0.1:8000/users/Обновить пользователя:
curl -s -X PATCH http://127.0.0.1:8000/users/1 -H "Content-Type: application/json" -d '{
"name": "Alice Updated"
}'Удалить пользователя:
curl -i -X DELETE http://127.0.0.1:8000/users/1Создать новость (автор должен быть верифицирован):
curl -s -X POST http://127.0.0.1:8000/news/ -H "Content-Type: application/json" -d '{
"title": "Breaking",
"content": {"body":"JSON body"},
"cover_url": null,
"author_id": 1
}'Список новостей:
curl -s http://127.0.0.1:8000/news/Обновить новость:
curl -s -X PATCH http://127.0.0.1:8000/news/1 -H "Content-Type: application/json" -d '{
"title": "Breaking Updated"
}'Удалить новость (удалит и комментарии к ней):
curl -i -X DELETE http://127.0.0.1:8000/news/1Создать комментарий:
curl -s -X POST http://127.0.0.1:8000/comments/ -H "Content-Type: application/json" -d '{
"news_id": 1,
"author_id": 2,
"text": "Nice!"
}'Список комментариев по новости:
curl -s "http://127.0.0.1:8000/comments/?news_id=1"Обновить комментарий:
curl -s -X PATCH http://127.0.0.1:8000/comments/1 -H "Content-Type: application/json" -d '{
"text": "Edited text"
}'Удалить комментарий:
curl -i -X DELETE http://127.0.0.1:8000/comments/1app/models.py— SQLAlchemy моделиapp/schemas.py— Pydantic-схемы (DTO)app/db.py— подключение к БД и зависимостьget_dbapp/routers/*.py— CRUD-ручки по сущностямalembic/— миграции (создание таблиц + мок-данные)
- Ручная проверка curl/Postman
- В ответах API используются стандартные коды: 201 (создано), 404 (не найдено), 403 (запрещено), 400 (ошибка валидации и т.п.)
- Python 3.10+
- Библиотеки: FastAPI, SQLAlchemy, Alembic, psycopg
- СУБД: Postgres
- Контент новости хранится как JSONB
- Каскадное удаление комментариев при удалении новости реализовано на уровне FK (
ondelete='CASCADE') иrelationship(cascade='all, delete-orphan')
- Попросите владельца организации добавить вас в
itmo-webdev(если ещё нет). - Создайте приватный репозиторий по шаблону имени:
lab1_Ivanov_A_A(замените на свою фамилию/инициалы). - Добавьте коллабораторов-проверяющих при необходимости.
- Залейте код из этого проекта (
git init,git remote add origin,git push -u origin main).
alembic revision --autogenerate -m "feat: change models"
alembic upgrade headДля расширения на MongoDB можно вынести слой репозиториев (интерфейсы + имплементации под SQLAlchemy/Mongo) и заворачивать их через FastAPI dependency.