在运行时更改Django设置

时间:2011-06-30 00:17:58

标签: django runtime settings

我想将一些(特定于应用程序的)设置公开给管理界面,这样用户可以轻松地更改它们,也不必重新启动Django。

我应该怎么做?

我检查了http://djangopackages.com/grids/g/live-setting/上的应用程序(btw django-constance是最吸引人的)但实际上所有这些应用程序正在做的是将值存储在数据库中,提供用于更改它们的Web界面和缓存。 Django中已经内置了前两个功能吗?

我看到的最大缺点是没有任何应用程序是这些设置的旧位置(settings.py)的替代品,并且要求我迁移到他们的表示法,并且经常添加另一个上下文处理器来访问它们在模板中。

我不能这样做吗?

  1. 为我的设置创建模型(这为我提供了各种类型和验证)
  2. 实例化一个这样的对象来保存我的设置(这允许用户在管理界面中编辑它们) - 我可以将默认值转储为像其他模型一样的固定装置
  3. 包装settings.py,以便对我的设置进行数据库查询 - http://www.loose-bits.com/2011/04/extending-django-settings-with-derived.html
  4. 从我目前的天真观点来看,我看到的唯一缺点是:

    1. 添加或更改可用设置需要架构迁移(南)。 - 我可以忍受。
    2. 我有一个可能有多个实例的模型,但实际上只需要一个单例。 - 在某些时候,这实际上可能是一个有用的功能。
    3. 性能/缓存:查看http://code.djangoproject.com/svn/django/trunk/django/conf/我必须在设置包装器和/或模型中加入一点聪明,以便模型更改清除或更新缓存值。 - 似乎不是火箭科学。
    4. 在另一个项目中做同样的事情需要再次进行类似的努力。 - 我认为settings.py中的单个字典常量,包含查找的模型名称和字段名称都是不同的。
    5. 这不是两个世界中最好的 - 运行时管理员(及其所有额外津贴),数据库后端,缓存以及我的所有设置.USED_TO_BE_IN_SETTINGS_DOT_PY需要进行任何更改。我错过了什么吗?

7 个答案:

答案 0 :(得分:17)

AFAIK,Django设置应该是不可变的。这有多种原因,最明显的是Django不知道服务器的执行模型(prefork / multi-threaded)。

此外,您无法从Django模型加载设置本身,因为在您可以使用ORM中的任何内容之前需要加载设置。

所以,基本上,你有两个解决方案:

  • 您可以使用任何较低级别的数据库访问机制来引导数据库中的设置来加载它们;或
  • 您可以在其他模型中定义设置,并在需要时直接获取它们。

第一个是令人难以置信的黑客,我不建议。第二种更直接,更清洁,但要求你改变习惯(from django.conf import settings)。

第二种方法可能是您链接到的第三方应用程序所实现的。

答案 1 :(得分:9)

答案 2 :(得分:6)

DATABASES是一个词典。所以你可以操纵字典:

import django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'

答案 3 :(得分:2)

看看:https://bitbucket.org/bkroeze/django-livesettings * Django-Livesettings是一个从Satchmo Project _拆分的项目。它提供了通过管理界面配置设置的功能,而不是通过编辑“settings.py”。*

也许它对你有帮助。

答案 4 :(得分:2)

老实说,当我分析他的代码时,我会得到更多的Django。在版本1.4.5中做了它(遵循下面的模块):

  • 的myproject \ manage.py

  • django \ core \ management__init __。py ## method - execute_manager

  • django \ conf__init __。py ## class - LazySettings; attr - _wrapped

  • django \ utils \ functional.py ## class LazyObject;重要的方法 - new_method_proxy

功能选项,但它有风险。在蟒蛇" _"将该属性视为受保护。

from django.conf import settings

settings._wrapped.INSTALLED_APPS = () ## *really work*

在以下项目中:https://github.com/alexsilva/DJPlugins 您可以在运行时看到此变量被修改。该项目的想法已经开始运作。

答案 5 :(得分:1)

您可以使用.configure()模块的推荐的settings方法:

from django.conf import settings
settings.configure(DEBUG=True)

settings模块具有其他便捷功能。选中docs

答案 6 :(得分:0)

您不能直接修改settings.py文件 例如: 如果您想在运行时更改数据库,则应该分离数据库的配置

# Projecr_name/user_database.py
user_database = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'name',
    'USER': 'admin',
    'PASSWORD': '111111',
    'HOST': '127.0.0.1',
    'PORT': '3306'
},
'user_db': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'user1',
    'USER': 'admin',
    'PASSWORD': '22222',
    'HOST': '127.0.0.1',
    'PORT': '3306'
}
}
# Projecr_name/settings.py
from .user_database import user_database
...
DATABASES = user_database
...

在逻辑视图中调用

# view.py
from ../Projecr_name/user_database import user_database
class Some(...):
    def Some(request):
    user_database['user_db']['NAME']='user2'

然后您可以使用这种方式在运行时更改任何设置