用来管理动态配置,django 的配置大多写在 settings.py
里面,是静态配置,项目加载后就无法更改。但有些场景下我们需要动态配置,一个很简单的方式是使用一个 model 来表示配置,在 django admin 页面中修改配置的值。
django-constance
将这个需求封装成了一个模块,安装即可使用,支持以数据库或 Redis 作为后端。
项目主页 https://github.com/jazzband/django-constance
安装
pip install django-constance
配置
# settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.staticfiles',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
...
'constance',
'constance.backends.database',
)
CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
# 配置了三个常量值,可以在 Admin 里面看到
# 可以通过 textfield 来编辑他们的值
CONSTANCE_CONFIG = OrderedDict({
'tags': ('tag1,tag2', '标签'),
'threshold': (100, '阈值'),
# 指定字段按照 str 类型来处理
'THE_ANSWER': (42, 'Answer to the Ultimate Question of Life', str),
})
配置完之后应该 migrate 一下,用于创建数据表,无需 makemigrations。
python manage.py migrate
自定义字段
CONSTANCE_ADDITIONAL_FIELDS = {
# 定义一个选项字段,在 admin 页面上将使用 Select 组件来修改它的值
'option_field': ['django.forms.fields.ChoiceField', {
'widget': 'django.forms.Select',
'choices': (('option1', 'option1'),
('option2', 'option2'),
('option3', 'option3'),
}],
# 定义一个文件字段,它的值是不带路径的文件名,后面可以添加 upload_to 参数指定上传路径
'file_field': ['django.forms.FileField'],
}
EMPTY_FILE = 'empty'
CONSTANCE_CONFIG = OrderedDict({
'option': ('option1', '选项', 'option_field'),
'tags': ('tag1,tag2', '标签'),
'threshold': (100, '阈值'),
'doc': (EMPTY_FILE, '文档', 'file_field'),
})
修改常量
在 Admin 页面里可以修改常量值,按 save 保存。
使用常量
```python
from constance import config
# read as string
config.option
# read as string
config.tags
# read as an interger
config.threshold
# read as string represent a filename without prefix
config.doc
```