Django integration layer for Weft
Project description
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.
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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file weft_django-0.9.5.tar.gz.
File metadata
- Download URL: weft_django-0.9.5.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73e9aac9f72ab1aded5df4303562d8816533c990f6a3d3452e5fab042c85d0cd
|
|
| MD5 |
fa1678b6c9a4d3dcf2e94cec30179a24
|
|
| BLAKE2b-256 |
0e24d913632416261aeee642f72f3de9c0dab3261e4ea7a0cf5b61fa266ba9a3
|
File details
Details for the file weft_django-0.9.5-py3-none-any.whl.
File metadata
- Download URL: weft_django-0.9.5-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0efbfc3b9aabe1a62979fb95a36009f2254ef9b583ef2d3f81efef40093a6c19
|
|
| MD5 |
4f946f6367ae4c44569dcd1a2de713b6
|
|
| BLAKE2b-256 |
02cb9ca27e88c9310c96cd1541211f5d858a944576c8ae2d44b8eeab002d1a90
|