如何让部分Django设置可供员工访问?
在Django中,设置内容是存放在一个叫做settings.py的文件里。这个文件是代码的一部分,会被放到代码库中。只有开发人员会处理这个文件,而管理员则主要处理模型和数据库中的数据。这些数据是非开发人员编辑的,网站访问者在模板中看到的也是这些数据。
问题是,我们的网站和很多其他网站一样,有很多设置选项需要非开发人员来编辑。我们说的是一些独立的、全站通用的常量,这些常量其实不应该放在数据库里。如果把它们放进数据库,就会产生很多没必要的查询。虽然使用缓存可以解决这个问题,但这样做似乎太复杂了,而实际上只需要在settings.py文件里加一行代码就能解决。
我注意到有一个叫做dbsettings的应用,但它已经很老了,也没有人维护了。我还发现django的电商应用Satchmo包含了这个dbsettings应用的一个特定版本。我们可以在我们的网站上做类似的东西,创建一个应用,把一些设置以键值对的形式存储在一个数据库表中,但我觉得这样做并不合适。为什么要把不该放在数据库里的东西放进去,只是为了让非开发人员更容易编辑呢?
我们在Django网站上有一系列全站的设置,希望非开发人员的管理员能够编辑。我们该怎么做才是最好的方法呢?
6 个回答
如果你必须避免服务器重启,那么把设置放在数据库里是个不错的选择,正如Dominic和Daniel所说。不过,每次更新设置时,你需要让缓存的设置对象失效。
看起来可以通过Django的低级缓存API来重新设置缓存中的值。你想要的功能应该可以通过这些调用实现:
cache.set('settings', local_settings)
cache.add('settings', local_settings)
local_settings = cache.get('settings')
cache.delete('settings')
我其实很喜欢dbsettings,一直想发布我修改过的版本,让它能和Django 1.1一起用(其实改动不大)。看起来已经有人更新过了。
不过,你说得对,这个方法可能对你来说有点复杂。我之前做过的一件事是,在settings.py文件的最后加一行代码,导入并解析一个YAML文件。YAML是一种简单的标记语言,最基本的格式就是KEY: VALUE
...
CONSTANT1: MyValue
CONSTANT2: Anothervalue
如果你把这个文件放在编辑器可以访问的地方,那么在settings.py的最后你只需要这样做:
import yaml
try:
globals().update(yaml.load(open('/path/to/my/yaml/file.yml')))
except:
pass
你需要安装Python YAML库来解析YML文件。
这种方法的缺点是,你需要重启Apache才能让它识别到更改。
补充说明:其实建立一个前端界面来编辑这个文件并提供一个按钮来运行脚本重启Apache并不特别困难。
像dbsettings这样的工具(正如你提到的)似乎是个不错的选择。根据这个项目的存在理由:
并不是所有的设置都适合放在
settings.py
里,因为它有一些 特定的限制:
设置是针对整个项目的。这不仅会让应用程序的设置搞得很乱,
settings.py
也会因此变得复杂,还增加了命名冲突的可能性。设置在Django的一个实例中是固定不变的。你不能在不重启应用的情况下更改它们。
要更改设置需要程序员来操作。即使这个设置对其他功能没有影响,还是需要程序员来修改。
如果dbsettings不适合你,那就自己实现一个,或者在它的基础上修改一下。看起来不会太难。