在运行时更改Django设置

Dan*_*air 47 django settings runtime

我想将一些(特定于应用程序的)设置暴露给管理界面,这样用户可以轻松地更改它们,也不必重新启动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

从我目前的天真观点来看,我看到的唯一缺点是:

  1. 添加或更改可用设置需要架构迁移(南).- 我可以忍受这一点.
  2. 我有一个可能有多个实例的模型,但实际上只需要一个单例. - 在某些时候,这实际上可能是一个有用的功能.
  3. 性能/缓存:查看http://code.djangoproject.com/svn/django/trunk/django/conf/我必须在设置包装器和/或模型中加入一点聪明,以便模型更改清除或更新缓存的值. - 似乎不是火箭科学.
  4. 在另一个项目中做同样的事情需要再次进行类似的努力. - 我认为settings.py中的单个字典常量,包含查找的模型名称和字段名称都是不同的.

这不是两个世界中最好的 - 运行时管理员(具有所有额外津贴),数据库后端,缓存,以及我的所有设置.USED_TO_BE_IN_SETTINGS_DOT_PY将需要任何更改.我错过了什么吗?

And*_*ron 19

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

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

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

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

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

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


ara*_*usa 6

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

import django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
Run Code Online (Sandbox Code Playgroud)

  • 问题是Django在什么时候读这个来创建`django.db.connections`.因为在那之后你将最终与ORM不同步. (2认同)
  • 不建议这样做。在 Python 中可以,但在 Django 中不应该。Python 允许您执行诸如访问“__foo”方法之类的操作,这些方法旨在“私有”。你可以,但这不好,你的代码有一天会崩溃。Django 设置被认为是不可变的。 (2认同)