weft-django
weft-django is the first-party Django integration for Weft.
The package is typed (py.typed) and depends on Weft through the public
weft.client API.
It provides:
@weft_taskfor Django-owned synchronous background functions- transaction-safe submission helpers such as
enqueue_on_commit() - native TaskSpec, stored spec, and pipeline submission helpers
- read-only Django URLs for task inspection
- SSE by default, with optional Channels/WebSocket transport
- Django management commands for task status and control
Install:
uv add weft-django
Or from the main package convenience extra:
uv add "weft[django]"
Install the optional Channels transport with:
uv add "weft-django[channels]"
Equivalent install surfaces:
uv add "weft-django[realtime]"
uv add "weft[django-channels]"
Basic usage:
from weft_django import weft_task
@weft_task(name="billing.send_invoice", timeout=60)
def send_invoice(invoice_id: int) -> dict[str, int]:
return {"invoice_id": invoice_id}
submission = send_invoice.enqueue(123)
result = submission.result(timeout=30)
assert result.status == "completed"
Submission Handle
enqueue(...) and the native submission helpers return WeftSubmission.
The handle exposes:
tidnamestatus()wait(timeout=None)result(timeout=None)stop()kill()events(follow=False)
status() returns the current public status string or None if no snapshot is
available yet. wait() and result() both return the structured Weft
TaskResult.
Module-level status(tid) and terminal_snapshot(tid) use Weft's compact
known-TID terminal snapshot path. They are read-only and can report terminal
Monitor-store fallback after raw task-log rows retire. Use snapshot(tid) when
callers need diagnostic fields such as task metadata, runtime details, or
timestamps.
enqueue_on_commit(...) and the native *_on_commit(...) helpers return
WeftDeferredSubmission. The deferred handle has a stable name immediately
and gains tid plus task methods after the outer transaction commits. Calling
result-like methods before commit raises a local RuntimeError.
Deferred helpers validate and snapshot before registering Django's
transaction.on_commit() callback. Missing spec references, invalid overrides,
and unserializable payloads fail before the app transaction commits. Mutating
args, kwargs, or payload objects after helper call time does not change the work
submitted at commit.
Native Helpers
Use these helpers when Django code wants to launch native Weft work instead of a decorated Django function:
from pathlib import Path
from weft_django import (
submit_pipeline_reference,
submit_spec_reference,
submit_taskspec,
)
task = submit_taskspec(taskspec, payload={"job": 1})
task = submit_spec_reference(Path(".weft/tasks/report.json"), payload={"job": 1})
task = submit_pipeline_reference("nightly-report", payload={"job": 1})
Keyword rules:
- native helpers use
payload=... work_payload=...andinput=...are intentionally not supported- deferred helpers reject
wait=True
Testing
weft-django does not ship an eager or inline execution mode.
Use the direct Python callable for narrow unit tests:
assert send_invoice(123)["invoice_id"] == 123
Use broker-backed tests for enqueue behavior, transaction hooks, process boundaries, streaming, native TaskSpecs, bundles, agents, and pipelines.
Realtime And URLs
Include the read-only URLs explicitly:
from django.urls import include, path
urlpatterns = [
path("weft/", include("weft_django.urls")),
]
You must configure an authz callable:
WEFT_DJANGO = {
"AUTHZ": "myapp.weft_authz:authorize",
}
Supported realtime settings:
WEFT_DJANGO = {
"REALTIME": {
"TRANSPORT": "sse", # "none" | "sse" | "channels"
},
}
Notes:
GET /weft/tasks/<tid>/returns the current task snapshotGET /weft/tasks/<tid>/events/is the SSE endpoint whenTRANSPORT="sse"TRANSPORT="none"disables the SSE endpointTRANSPORT="channels"switches browser realtime delivery to the optional WebSocket consumer inweft_django.channels- the Channels consumer starts a cancellable background stream after socket accept rather than blocking the connect lifecycle
- the HTTP and realtime surfaces are diagnostics only; they do not create a second task-truth store
Celery Migration Guide
| Celery habit | weft-django |
|---|---|
@shared_task |
@weft_task |
task.delay(...) |
task.enqueue(...) |
transaction.on_commit(lambda: task.delay(...)) |
task.enqueue_on_commit(...) |
AsyncResult |
WeftSubmission |
delay and shared_task are intentionally not shipped. They are close enough
to invite mechanical porting and far enough from Weft semantics to create
delayed failures.
Release files for weft-django 0.9.33
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| weft_django-0.9.33.tar.gz | 14.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| weft_django-0.9.33-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.6 kB
Release files / weft_django-0.9.33.tar.gz
| Download URL | weft_django-0.9.33.tar.gz |
|---|---|
| Size | 14.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
79753ee10001c63d71d521f0c2e540cd2f77d22f2610a4871cb9f3903a929e0f
|
|
BLAKE2b-256 checksum How to use checksums |
20bfce4bb5eec2a8b692bf0111e3d8a7bba250d7bc6b6b022beff402ae657611
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / weft_django-0.9.33-py3-none-any.whl
| Download URL | weft_django-0.9.33-py3-none-any.whl |
|---|---|
| Size | 23.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6703a0dd927f062fa0e061fed2620b92026b8481f601a56876a258d69aaeadd2
|
|
BLAKE2b-256 checksum How to use checksums |
bc1359c5c29f9511fee4d1dd8c5c2b9a3444f589e4870d4fd2536e295930b4bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|