在Django中存储重要的奇异值

时间:2010-12-28 09:33:11

标签: django

所以我正在开发一个网站,其中有一些重要的值可以在整个网站的各个地方使用。例如,某些重要日期,例如注册的开始日期和结束日期。

我能做到这一点的一种方法是制作一个存储这些值的模型,但这听起来有点过分(因为我只有一个实例)。另一种方法是将这些值存储在settings.py文件中,但如果我想更改它们,似乎我需要重新启动Web服务器才能使它们生效。我想知道Django最好的做法是处理这类事情。

2 个答案:

答案 0 :(得分:1)

您可以将它们存储在settings.py中。虽然这没有任何问题(你甚至可以将你的设置组织成多个不同的文件,如果你有许多自定义设置),你是对的,你不能在运行时更改它们。

我们在工作中解决了同样的问题,想出了一个名为django-constance的简单应用程序(你可以从https://github.com/comoga/django-constance的github获得它)。这样做可以将您的设置存储在settings.py中,但是一旦您需要将它们转换为可在运行时配置的设置,您就可以使用django admin frontend切换到Redis数据存储。您甚至可以使用设置中的值作为默认值。我建议你试试这个应用程序。

您对代码的更改非常小,因为您从初始化动态设置的文档中粘贴了这样的内容:

CONSTANCE_CONFIG = {
    'MY_SETTINGS_KEY': (42, 'the answer to everything'),
}

然后不是从django conf导入设置,而是执行此操作:

from constance import config

if config.MY_SETTINGS_KEY == 42:
    answer_the_question()

答案 1 :(得分:0)

如果您希望所有模板都有一组特定的变量,那么您需要的是Context Processors。

http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors

更多链接

http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/ http://blog.madpython.com/2010/04/07/django-context-processors-best-practice/

上下文处理器的代码可以存在于项目的任何位置。您只需将其添加到您的settings.py下:

TEMPLATE_CONTEXT_PROCESSORS =

您可以在settings.py或甚至在constants.py下定义常量,只需

from constants import *

但是,正如您所提到的,每次更新设置时都需要重新加载服务器。我想你首先要弄清楚你多久会改变这些设置?是否需要额外的努力才能自动重新加载设置?

如果您想自动启用这些设置,每次更新时都可以执行以下操作:

  1. 将设置存储在数据库
  2. 保存/更改后,将输出写入文件
  3. settings.py / constants.py读取文件
  4. 重装服务器
  5. 此外,您还可以查看mezzanine project,它允许您从django管理界面更新设置并重新加载。

    请参阅:http://mezzanine.jupo.org/docs/configuration.html

    如果您需要的变量不经常更新,我建议您将它们存储在settings.py中并添加自定义上下文处理器。

    如果您使用GIT之类的源代码管理,更新将非常简单,您只需更新文件并推送到您的服务器即可。为了真正简单地重新加载服务器,你还可以为git创建一个post-recieve hook,它会在推送新代码时自动重新加载服务器。

    如果您要定期更新设置,我只会建议其他选项。