A warning for those writing plugin apps -- don't load Django settings during module init

I recently made the unpleasant discovery that a Django setting I had added to a plugin app as a feature switch did not actually work when I needed to disable the feature in a hurry.

Here’s the sort of code that does the wrong thing in a plugin app if it’s run at module import time (e.g. written at the module top level):

from django.conf import settings

SOME_FEATURE = getattr(settings, 'SOME_FEATURE', None)

In a normal Django app that’s loaded via INSTALLED_APPS, SOME_FEATURE will receive the configured value; in a plugin app, it will receive None.

It turns out this is because the plugin app is imported while the settings are still loading, which means none of the settings are available yet. The workaround is to move that initialization to the ready() method or similar.

I’ve added a warning to the docs for now, but also see https://github.com/openedx/edx-django-utils/issues/438 for possible ways to remove this stumbling block in the future.

As a side note, I’ve often been a little skeptical of whether it’s a good idea to load settings at the top level anyhow. It makes assumptions about import and init order. So maybe it’s good to avoid that pattern in regular Django apps, too.