Opened 13 hours ago

Last modified 4 hours ago

#36816 new New feature

Allow **kwargs in @task decorator to support custom Task subclasses

Reported by: Pietro Owned by:
Component: Tasks Version: 6.0
Severity: Normal Keywords: task
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description

Currently, the @task decorator accepts a fixed set of parameters and passes only those to task_class:

Problem: When using a custom backend with a custom task_class that accepts additional parameters (e.g., max_retries, timeout), there's no way to pass those through the decorator.

def task(
    function=None,
    *,
    priority=DEFAULT_TASK_PRIORITY,
    queue_name=DEFAULT_TASK_QUEUE_NAME,
    backend=DEFAULT_TASK_BACKEND_ALIAS,
    takes_context=False,
):
    # ...
    return task_backends[backend].task_class(
        priority=priority,
        func=f,
        queue_name=queue_name,
        backend=backend,
        takes_context=takes_context,
        run_after=None
    )

Proposed solution: Add kwargs to the decorator signature and pass it through to task_class:

def task(
    function=None,
    *,
    priority=DEFAULT_TASK_PRIORITY,
    queue_name=DEFAULT_TASK_QUEUE_NAME,
    backend=DEFAULT_TASK_BACKEND_ALIAS,
    takes_context=False,
    **kwargs,
):
    def wrapper(f):
        return task_backends[backend].task_class(
            priority=priority,
            func=f,
            queue_name=queue_name,
            backend=backend,
            takes_context=takes_context,
            run_after=None,
            **kwargs,
        )
    

Use case example:

class MyTask(Task):
    def __init__(self, *, max_retries=3, timeout=300, **kwargs):
        super().__init__(**kwargs)
        self.max_retries = max_retries
        self.timeout = timeout

# With the proposed change:
@task(backend="my_backend", max_retries=5, timeout=600)
def my_task():
    pass

This change is backwards compatible and aligns with Django's common extensibility patterns.

Change History (2)

comment:2 by Kshitij, 8 hours ago

Type: BugNew feature

comment:3 by JaeHyuckSa, 4 hours ago

Has patch: unset
Note: See TracTickets for help on using tickets.
Back to Top