一尘不染

在运行时更改Django设置

django

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

我应该怎么做?

我在http://djangopackages.com/grids/g/live-setting/上签出了应用程序(btw django-constance最吸引人),但实际上所有这些应用程序所做的就是将值存储在数据库中,从而提供了一个网站。界面来更改它们,并进行缓存。Django内置的前两个功能不是吗?

我看到的最大缺点是,这些应用程序都不能直接替换这些设置的旧位置(settings.py),需要我迁移到它们的表示法,并且经常添加其他上下文处理器以在模板中访问它们。

我不能只是这样做吗?

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

  4. 添加或更改可用设置需要进行模式迁移(南)。- 我可以忍受这一点。

  5. 我有一个可能带有多个实例的模型,但实际上只需要一个实例。-在某些时候实际上可能是有用的功能。
  6. 性能/缓存:查看http://code.djangoproject.com/svn/django/trunk/django/conf/,我必须在设置包装器和/或模型中添加一些技巧,以便更改模型清除或更新缓存的值。-似乎不是火箭科学。
  7. 在另一个项目中执行相同操作将再次需要类似的工作。-我认为settings.py中只有一个字典常量,其中包含要查找的模型名称和字段名称,这将有所不同。
    这不是两全其美的吗-运行时管理员(具有所有优势),数据库后端,缓存以及我的任何设置。USED_TO_BE_IN_SETTINGS_DOT_PY不需要任何更改。我想念什么吗?

阅读 619

收藏
2020-03-31

共1个答案

一尘不染

AFAIK,Django设置应该是不可变的。造成这种情况的原因有多种,最明显的原因是Django不了解服务器的执行模型(prefork /多线程)。

另外,你无法从Django模型本身加载设置,因为需要先加载设置,然后才能在ORM中使用任何内容。

因此,基本上,你有两种解决方案:

  • 你可以使用任何较低级别的数据库访问机制从数据库中引导设置来加载它们;要么
  • 你可以只在其他模型中定义设置,并在需要时直接获取它们。
    首先是令人难以置信的黑客攻击,我不建议这样做。第二种方法更直接,更清洁,但是需要你改变惯常的习惯(from django.conf import settings)。

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

2020-03-31