在运行时更改 Django 设置

问题描述 投票:0回答:5

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

我该怎么办?

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

我看到的最大缺点是,没有一个应用程序可以直接替代这些设置的旧位置(settings.py),并且需要我迁移到它们的符号,并且经常添加另一个上下文处理器来在模板中访问它们.

我不能这样做吗?

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

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

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

这不是两全其美吗 - 运行时管理(及其所有特权)、数据库后端、缓存以及我的任何设置。USED_TO_BE_IN_SETTINGS_DOT_PY 都不需要任何更改。我是不是错过了什么?

django runtime settings
5个回答
28
投票

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

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

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

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

第一个是令人难以置信的黑客,我不建议这样做。第二种更直接、更干净,但需要你改变平时的习惯(

from django.conf import settings
)。

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


17
投票

11
投票

DATABASES
是一个字典。所以你可以操纵字典的方式:

import django.conf as conf

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

2
投票

看一下:https://bitbucket.org/bkroeze/django-livesettings *Django-Livesettings 是从

Satchmo Project
_ 拆分出来的项目。它提供了通过管理界面配置设置的能力,而不是通过编辑“settings.py”。*

也许对你有帮助。


2
投票

老实说,当我分析他的代码时,我对 Django 有了更多的了解。在 1.4.5 版本中做到了(按照下面的模块):

  • 我的项目\manage.py

© www.soinside.com 2019 - 2024. All rights reserved.