Skip to main content

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_task for 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:

  • tid
  • name
  • status()
  • 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=... and input=... 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 snapshot
  • GET /weft/tasks/<tid>/events/ is the SSE endpoint when TRANSPORT="sse"
  • TRANSPORT="none" disables the SSE endpoint
  • TRANSPORT="channels" switches browser realtime delivery to the optional WebSocket consumer in weft_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

weft_django-0.9.21.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

weft_django-0.9.21-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file weft_django-0.9.21.tar.gz.

File metadata

  • Download URL: weft_django-0.9.21.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for weft_django-0.9.21.tar.gz
Algorithm Hash digest
SHA256 256c3a3347bb65fccd60a366c2e7d80d605ca2eedc11f6232054615609c15876
MD5 74032a785d9d86e9be8474da28cd1d43
BLAKE2b-256 a4dbd371b5bbe36fb1d8728ff7f7b400a843a86d7f42c432450e34414d7ce26b

See more details on using hashes here.

File details

Details for the file weft_django-0.9.21-py3-none-any.whl.

File metadata

  • Download URL: weft_django-0.9.21-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for weft_django-0.9.21-py3-none-any.whl
Algorithm Hash digest
SHA256 2356cd77dccbdbed9021ce07eb3adee009b0643abba10e8334fba9c07bd19266
MD5 0776d5be14be5250c0774f7ea2351d4c
BLAKE2b-256 2af194bbb7dab1f257444e5fc9eed75f066dd4cd2e8eabc8442eed439651bc8f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page