Bogdanp / django_dramatiq

A Django app that integrates with Dramatiq.
https://dramatiq.io
Other
331 stars 77 forks source link

Can't use GroupCallbacks middleware (Duplicated) #81

Closed dnmellen closed 3 years ago

dnmellen commented 3 years ago

Hi, I'm trying to use GroupCallbacks in django_dramatiq but it seems that callback is not really compatible:

My settings:

if TESTING:
    DRAMATIQ_BROKER = {
        "BROKER": "dramatiq.brokers.stub.StubBroker",
        "OPTIONS": {},
        "MIDDLEWARE": [
            "dramatiq.middleware.AgeLimit",
            "dramatiq.middleware.TimeLimit",
            "dramatiq.middleware.GroupCallbacks",
            "dramatiq.middleware.Callbacks",
            "dramatiq.middleware.Pipelines",
            "dramatiq.middleware.Retries",
            "django_dramatiq.middleware.DbConnectionsMiddleware",
        ]
    }

Error:

File "/venv/lib/python3.7/site-packages/django_dramatiq/apps.py", line 107, in <module>
    DjangoDramatiqConfig.initialize()
  File "/venv/lib/python3.7/site-packages/django_dramatiq/apps.py", line 69, in initialize
    middleware = [load_middleware(path) for path in broker_settings.get("MIDDLEWARE", [])]
  File "/venv/lib/python3.7/site-packages/django_dramatiq/apps.py", line 69, in <listcomp>
    middleware = [load_middleware(path) for path in broker_settings.get("MIDDLEWARE", [])]
  File "/venv/lib/python3.7/site-packages/django_dramatiq/utils.py", line 17, in load_middleware
    return load_class(path_or_obj)()
TypeError: __init__() missing 1 required positional argument: 'rate_limiter_backend'

GroupCallbacks initializer needs rate_limiter_backend as parameter:

class GroupCallbacks(Middleware):
    def __init__(self, rate_limiter_backend):
        self.rate_limiter_backend = rate_limiter_backend

But django_dramatiq is not passing extra params when loading the middleware:

apps.py:

middleware = [load_middleware(path) for path in broker_settings.get("MIDDLEWARE", [])]

utils.py:

def load_middleware(path_or_obj):
    if isinstance(path_or_obj, str):
        return import_string(path_or_obj)()  <-- No param passed
    return path_or_obj

How can I use GroupCallbacks in django_dramatiq? Do I need to modify how django_dramatiq initializes or is there another way?

Thanks!