#34829 closed Bug (worksforme)

Django reports the “mutually exclusive” error for settings that do not contain STATICFILES_STORAGE.

Reported by: Malik A. Rumi Owned by: nobody
Component: File uploads/storage Version: 4.2
Severity: Normal Keywords: mutually exclusive
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Mariusz Felisiak)

There is no STATICFILES_STORAGE constant in my settings module. I took a look at the bytecode in pycache. There was no reference to STATICFILES_STORAGE there, either, but I did see a reference to STATICFILES_DIRS. I deleted all pycache files and their folders, but the same identical error persisted.

I looked at the source code that was generating the error:

python3.11/site-packages/django/conf/init.py

specifically, line 278, which happens to be inside the definition of a class Settings.

        if self.is_overridden("STATICFILES_STORAGE"):
            if self.is_overridden("STORAGES"):
                raise ImproperlyConfigured(
                    "STATICFILES_STORAGE/STORAGES are mutually exclusive."
                )

The assumption seems to be that if both are overridden the dev is using both of them, and hence the error. Because I use white noise, it makes sense that STORAGES has been overridden. But since I have no reference to STATICFILES_STORAGE anywhere, it follows that the default value of global_settings is being inherited in my local settings, thus generating the error.

django/django/conf/global_settings.py, line 630:

STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage"

The problem here is that on line 274 of the same file, we have:

STORAGES = {
    "default": {
        "BACKEND": "django.core.files.storage.FileSystemStorage",
    },
    "staticfiles": {
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    },
}

Are these constants mutually exclusive for everything but global_settings? I commented the entire block:

            # if self.is_overridden("STATICFILES_STORAGE"):
            #     if self.is_overridden("STORAGES"):
            #         raise ImproperlyConfigured(
            #             "STATICFILES_STORAGE/STORAGES are mutually exclusive."
            #         )
            #     warnings.warn(STATICFILES_STORAGE_DEPRECATED_MSG, RemovedInDjango51Warning)

And that worked:

        (chronicle-jltMOQ-O-py3.11) malikarumi@Tetuoan2:~/Projects/lifeandtimes/chronicle$ python manage.py runserver
        Watching for file changes with StatReloader
        Performing system checks...
        
        System check identified no issues (0 silenced).

Change History (1)

comment:1 by Mariusz Felisiak, 12 months ago

Description: modified (diff)
Resolution: worksforme
Status: newclosed

Thanks for the report, however it works for me. Perhaps 3rd-party packages defines both settings. Check TicketClosingReasons/UseSupportChannels for ways to get help, folks on support channels can help you debug your issue.

Are these constants mutually exclusive for everything but global_settings?

Exactly.

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