Skip to content

Lesson 5: Celery email worker (mock, idempotency, weekly digest, Alembic)#5

Open
TungChangxinhnhat wants to merge 6 commits into
itmo-webdev:mainfrom
TungChangxinhnhat:feature/email-worker
Open

Lesson 5: Celery email worker (mock, idempotency, weekly digest, Alembic)#5
TungChangxinhnhat wants to merge 6 commits into
itmo-webdev:mainfrom
TungChangxinhnhat:feature/email-worker

Conversation

@TungChangxinhnhat

Copy link
Copy Markdown

Что сделано

  • Добавлены Celery worker и Celery beat (еженедельная рассылка).
  • Очереди Redis (redis://localhost:6379/0) и результаты (…/1).
  • Таблица идемпотентности sent_emails + миграции Alembic (исключает повторную отправку).
  • Эндпоинт POST /news создаёт запись и публикует задачу send_news_notification.
  • Логи Celery пишутся в logs/email_worker.log (RotatingFileHandler).

Основные файлы

  • 5-lesson/app/celery_app.py — конфигурация Celery.
  • 5-lesson/app/tasks/email.py — задачи send_news_notification, send_weekly_digest.
  • 5-lesson/app/models.py — модели User, News, SentEmail.
  • 5-lesson/app/routers/news.py — эндпоинт POST /news.
  • 5-lesson/alembic/versions/create_sent_emails.py — миграции таблицы sent_emails.

Как запустить (локально)

  1. Redis:
    docker run --name lms-redis -p 6379:6379 -d redis:7-alpine

  2. Переменные окружения:
    в 5-lesson/.env задать DATABASE_URL=..., REDIS_URL=redis://localhost:6379/0

  3. API:
    python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

  4. Celery worker:
    export PYTHONPATH="$PWD"
    celery -A app.celery_app.celery worker --loglevel=info --hostname=worker@%h

  5. Celery beat:
    celery -A app.celery_app.celery beat --loglevel=info

Проверка

  • curl -X POST http://127.0.0.1:8000/news -H "Content-Type: application/json" -d '{"title":"Hello","body":"World"}' → 200 OK
  • В БД есть news, в логе Celery видно выполнение задачи.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants