Skip to main content

VintaSend Celery

Celery integration for VintaSend. It lets a NotificationService hand background sends to a Celery worker.

This package does not implement a delivery adapter. It provides the queue service that enqueues a notification id and the task factories that register VintaSend's worker entrypoints as Celery tasks. The worker reloads the notification from your backend and delivers it through your own background adapter.

Installation

pip install vintasend vintasend-celery

How it fits together (VintaSend 2.0)

The background payload is just the notification id:

  1. Your adapter subclasses VintaSend's BackgroundNotificationAdapter and puts its delivery in send().
  2. NotificationService.send() sees the background adapter and hands the notification id to its notification_queue_service — the CeleryNotificationQueueService from this package.
  3. The queue service calls .delay(notification_id) on the Celery task that runs VintaSend's send_notification.
  4. The worker rebuilds a NotificationService (from NOTIFICATION_SERVICE_FACTORY, or one you pass in) and calls delayed_send(notification_id), which reloads the notification, generates the context at delivery time, and calls your adapter's send().

Attachments work on this path without extra effort: the worker reads them from the backend.

Quick start

Register the worker task and wire the queue service against it:

from celery import Celery
from vintasend.services.notification_service import NotificationService
from vintasend.tasks.background_tasks import send_notification

from vintasend_celery.services.notification_queue_services.celery_queue_service import (
    CeleryNotificationQueueService,
)
from vintasend_celery.tasks.background_tasks import send_notification_task_factory

celery_app = Celery("myapp", broker="redis://localhost:6379/0")

# Register VintaSend's id-only worker entrypoint as a Celery task.
send_notification_task = send_notification_task_factory(celery_app)

# The web process builds its service with this queue service.
queue_service = CeleryNotificationQueueService(send_notification_task=send_notification_task)

notification_service = NotificationService(
    notification_adapters=[
        MyBackgroundEmailAdapter(...)
    ],  # subclasses BackgroundNotificationAdapter
    notification_backend=MyBackend(...),
    notification_queue_service=queue_service,
)

The worker needs to rebuild the service from scratch to get a live database session, so point NOTIFICATION_SERVICE_FACTORY at a callable that returns a ready NotificationService:

# myapp/worker.py
def notification_service_factory():
    return NotificationService(
        notification_adapters=[MyBackgroundEmailAdapter(...)],
        notification_backend=MyBackend(...),
    )
export NOTIFICATION_SERVICE_FACTORY="myapp.worker.notification_service_factory"

The web and worker processes must read the same NOTIFICATION_BACKEND so the id resolves to the same notification in both.

Periodic draining

To flush notifications whose send_after has arrived, register the periodic task and schedule it on Celery beat:

from vintasend_celery.tasks.periodic_tasks import (
    periodic_send_pending_notifications_task_factory,
)

periodic_task = periodic_send_pending_notifications_task_factory(celery_app)

AsyncIO hosts

If your NOTIFICATION_SERVICE_FACTORY returns an AsyncIONotificationService, use the AsyncIO queue service and task factory instead:

from vintasend_celery.services.notification_queue_services.celery_queue_service import (
    AsyncIOCeleryNotificationQueueService,
)
from vintasend_celery.tasks.background_tasks import async_send_notification_task_factory

async_task = async_send_notification_task_factory(celery_app)
queue_service = AsyncIOCeleryNotificationQueueService(send_notification_task=async_task)

Upgrading from 1.x

This release is a breaking change. See RELEASE_NOTES.md and the repository's MIGRATION_TO_2.0.0.md for the full upgrade procedure, including draining or dual-registering the Celery queue before deploying the 2.0 worker.

Metadata

Release files for vintasend-celery 3.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vintasend-celery 3.2.0
File Size Uploaded
vintasend_celery-3.2.0.tar.gz 9.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vintasend-celery 3.2.0
File Interpreter ABI Platform
vintasend_celery-3.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 21.4 kB

Release files / vintasend_celery-3.2.0.tar.gz

Download URL vintasend_celery-3.2.0.tar.gz
Size 9.6 kB
Tags Source
SHA-256 checksum
How to use checksums
81baf3692426ea86a800da54ee9fb0e3b6eec7f118cb5d1c020dca935da18618
BLAKE2b-256 checksum
How to use checksums
9a3d924ac6d5c2900b113f99704fc06ca1b7dda4c066df40ba2e28f84f4ae2e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / vintasend_celery-3.2.0-py3-none-any.whl

Download URL vintasend_celery-3.2.0-py3-none-any.whl
Size 11.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f1e8a36c679c6752f8e3540739092746c07afabab6ce92d8d8e8ebc8afb94994
BLAKE2b-256 checksum
How to use checksums
6a395a76686113ce6417182cc35a0d1026f3ce46281afe3c44df17fab631692a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

3.5.0

2 release files

3.4.0

2 release files

3.3.0

2 release files

This release

3.2.0 This release

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.0.0

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.0.1

2 release files

0.1.4

2 release files

0.1.2

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page