Working with Django addons (legacy)
Aldryn continues to be supported by Divio, but we do not recommend using Aldryn Django for new applications.
In Django applications, settings are handled via the settings module (usually, the
settings.py
file).
In Aldryn addons - those that include an aldryn_config.py
file - many of these settings will be automatically
managed by the addon itself. This takes place in aldryn_config.py
.
All key settings (i.e. settings required for the package to function correctly) as well as many optional settings will be configured. They are then applied to the settings module via the lines:
import aldryn_addons.settings
aldryn_addons.settings.load(locals())
From this point in the settings module, those settings that were automatically configured by the addon will be available
in the settings.py
file.
For example, in a Django application, you will find a file:
addons/aldryn-django/aldryn_config.py
This file adds items to the INSTALLED_APPS
, MIDDLEWARE
, and applies other settings.
These settings can be controlled and determined in a number of different ways.
Via addon settings in the Control Panel
An addon can expose options for configuration in the Control Panel interface. For example, Aldryn Django has a
PREFIX_DEFAULT_LANGUAGE
option. This will apply to all environments of the application.
The value is stored in JSON. You can find the JSON file in the application locally, for example
addons/aldryn-django/settings.json
.
Via environment variables
Environment variables are suitable for:
- environment-specific settings (e.g. database settings, since each environment should have its own)
- secret settings (e.g. keys for services and APIs)
Environment variables are better than the codebase for such settings. If committed as part of the codebase, they provide the same value in all environments, and they are vulnerable to being accidentally shared.
Via automatically applied environment variables
Some environment variables are provided automatically, and you don't need to do anything about them at all.
Each application environment has its own variables provided for services such as the database
DEFAULT_DATABASE_DSN, media storage (DEFAULT_STORAGE_DSN)
and so on. Locally, the variables are saved in the .env-local
file and loaded into the environment via docker compose.
Via user-configured environment variables
Other environment variables can be provided by the user, via the Control Panel's Env Variables view.
If you need the variable in the local development environment as well, add (for example):
SECRET_API_KEY = "aaPfaH1oJ5pdqYBc"
to its .env-local
file.
Manually in settings.py
As mentioned above, all these settings will be applied to the settings file by the
aldryn_addons.settings.load(locals())
function. If any of them were written into the file manually before this
point, it will overwrite them. Any settings you wish to provide manually should be added after the function to avoid
this.
Overwriting automatically-configured settings
Overwriting automatically-configured settings is almost always a bad idea. For example, multiple addons may have added their own requirements to the MIDDLEWARE
setting. If you simply do:
MIDDLEWARE = [
...
]
you will obliterate the automatic configuration (or if you place your setting before
aldryn_addons.settings.load(locals())
, your own setting will be overwritten).
If for example you need to specify additional middleware, the safer and more sophisticated way to do it is by manipulating the list (see How to configure Django settings in Aldryn applications).
To understand which settings are provided automatically, you can:
- examine the addon's
aldryn_config.py
file - check the reference documentation for Aldryn Django, Aldryn SSO and Aldryn Addons, where many important settings are listed
You can list changed settings to see those that have been altered from Django's own defaults.
Anatomy of a Divio addon
Aldryn continues to be supported by Divio, but we do not recommend using Aldryn Django for new applications.
Basic file structure
For an addon "Susan Example Application":
addons-dev/
susan-example-application/
addon.json
LICENSE
MANIFEST.in
README.rst
setup.py
susan_example_application/
__init__.py
aldryn_config.py
All addons have an aldryn_config.py
file that takes care of settings, which are then loaded into
settings.py.
This means that any settings you need to apply in an application can't simply be applied in your settings.py
if an
addon also needs access to them.
For example, nearly every addon will add a package, or sometimes several, to INSTALLED_APPS
. If you were to assign do INSTALLED_APPS = [...]
in the usual way, you would overwrite the existing assignments and break the application. That's why our settings.py
uses:
INSTALLED_APPS.extend([
# add your application specific apps here
])
The same goes for middleware, and other settings.
aldryn_config.py
is loaded into the Django application at runtime, so any changes are picked up when and reloaded automatically when developing.
aldryn_config.py
is an ideal place to check for environment variables that should be converted into Django settings.
See Addon configuration with aldryn_config.py.
addon.json
A metadata file.
{
"package-name": "susan-example-application",
"installed-apps": ["susan_example_application"]
}
setup.py
setup.py
will be generated by the Control Panel on the basis of the information you provided when you first created it there. The lines highlighted below are those that will be specific to your addon:
# -*- coding: utf-8 -*-
from setuptools import setup, find_packages
from susan_example_application import __version__
setup(
name='susan-example-application',
version=__version__,
description=open('README.rst').read(),
author='Susan',
author_email='susan@example.com',
packages=find_packages(),
platforms=['OS Independent'],
install_requires=["example_application==1.8.3"],
include_package_data=True,
zip_safe=False,
)
Django addons and templates
Templates at the application level will override templates at the application level if they are on similar paths. This is standard Django behaviour, allowing application developers to provide templates that can easily be customised.
On initial application creation
For your convenience, when you first create an application, any templates in addons are copied to the application level so you have them right at hand (if the addon's package name and inner application name match.)
For example, templates from Aldryn News & Blog will be copied to templates/aldryn_newsblog/
in your application.
If a template does not exist in the application's templates
directory, Django will simply fall back to the one in the addon itself.
Subsequent addon updates
After templates have been copied to the application's templates
directory, they will not be copied again, so as not to overwrite any changes the application developer may have made. However, this does mean that if an addon is subsequently updated and its templates change, those changes will not appear in your application.
In this case:
- if you have made changes to the templates in your application, you will need to obtain any updated templates and merge them with your own versions
- if you have not made any changes, you can simply delete your local versions and Django will use the updated application templates.
Caching with Aldryn Django
Database caching is the default cache backend for Aldryn Django applications, with Django's database caching configured and ready to use.
The Aldryn django CMS addon applies additional caching rules by default, via the CMS_CACHE_DURATIONS setting.
Control over caching settings is exposed in the Divio Control Panel in the configuration options for Aldryn django CMS. Defaults are to cache content for 60 seconds and menus for one hour.
It is often convenient to disable caching while developing or working intensively on content. Adding:
import os
env = os.getenv
STAGE = env('STAGE', 'local').lower()
if STAGE in {'local', 'test'}:
CMS_PAGE_CACHE = False
CMS_PLACEHOLDER_CACHE = False
CMS_CACHE_DURATIONS = {
'menus': 0,
'content': 0,
'permissions': 0,
}
to the application's settings.py
will disable all caching in the CMS in the local and Test environments.
Environment variables with Aldryn
Many of the applications packaged for Divio deployment recognise a number of environment variables for your convenience.
See Aldryn Django (core Django) for lists of settings that can be provided as variables in some Divio addons.
They do this in their Addon configuration with aldryn_config.py files. To see precisely how they are handled, refer to the aldryn_config.py
file of key addons (important: make sure you are looking at the correct version of the addon, as different versions of the packages will assume different variables
and settings):
Our uWSGI application gateway in Aldryn Django applications also recognises environment variables that commence UWSGI_
.
For more information, see the full overview of how to manage environment variables or the Environment variables reference.