This package provides integration of Dishka DI framework and RQ task queue manager.
- Automatic Scope Management: Handles REQUEST and SESSION scopes per RQ job execution.
- Dependency Injection: Injects dependencies into task handlers via:
- Subclassed
DishkaWorker
for auto-injection. @inject
decorator for manual setup with standard RQ workers.
- Subclassed
Install using pip
pip install dishka-rq
Or with uv
uv add dishka-rq
- Set Up Providers and Container
Define your Dishka providers and container as usual:
from dishka import Provider, Scope, provide, make_container
class StrProvider(Provider):
@provide(scope=Scope.REQUEST)
def hello(self) -> str:
return "Hello"
provider = StrProvider()
container = make_container(provider)
- Annotate Task Dependencies
Use FromDishka[...]
to mark injected parameters:
from dishka import FromDishka
def hello_world(hello: FromDishka[str]):
return f"{hello} world!"
- Run worker
Start an RQ worker with DishkaWorker:
from dishka_rq import DishkaWorker
from redis import Redis
conn = Redis()
queues = ["default"]
worker = DishkaWorker(container=container, queues=queues, connection=conn)
worker.work(with_scheduler=True)
python run_worker.py
If you don't need autoinjection or do not want to use custom DishkaWorker subclass.
- Set Up Providers and Container
Same as Method 1.
- Decorate Task Functions
Use @inject
and annotate dependencies:
from dishka_rq import inject, FromDishka
@inject
def hello_world(hello: FromDishka[str]):
return f"{hello} world!"
- Configure Standard RQ Worker
Attach Dishka to an RQ worker:
from dishka_rq import setup_dishka
from rq import Worker
from redis import Redis
worker = Worker(queues=["default"], connection=Redis())
setup_dishka(worker, container)
worker.work(with_scheduler=True)
- Python 3.10+
- Dishka >= 1.4.2
- RQ >= 2.0