所以我正在开发一个网站,其中有一些重要的值可以在整个网站的各个地方使用。例如,某些重要日期,例如注册的开始日期和结束日期。
我能做到这一点的一种方法是制作一个存储这些值的模型,但这听起来有点过分(因为我只有一个实例)。另一种方法是将这些值存储在settings.py
文件中,但如果我想更改它们,似乎我需要重新启动Web服务器才能使它们生效。我想知道Django最好的做法是处理这类事情。
答案 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 *
但是,正如您所提到的,每次更新设置时都需要重新加载服务器。我想你首先要弄清楚你多久会改变这些设置?是否需要额外的努力才能自动重新加载设置?
如果您想自动启用这些设置,每次更新时都可以执行以下操作:
此外,您还可以查看mezzanine project,它允许您从django管理界面更新设置并重新加载。
请参阅:http://mezzanine.jupo.org/docs/configuration.html
如果您需要的变量不经常更新,我建议您将它们存储在settings.py中并添加自定义上下文处理器。
如果您使用GIT之类的源代码管理,更新将非常简单,您只需更新文件并推送到您的服务器即可。为了真正简单地重新加载服务器,你还可以为git创建一个post-recieve hook,它会在推送新代码时自动重新加载服务器。
如果您要定期更新设置,我只会建议其他选项。