如何使员工可以访问某些Django设置?

问题描述:

在Django中,设置存储在settings.py文件中。该文件是代码的一部分,并进入存储库。只有开发人员处理这个文件。管理员处理模型,数据库中的数据。这是非开发人员编辑的数据,访问者在模板中看到的数据。如何使员工可以访问某些Django设置?

事情是,我们的网站,和其他许多人,有很多设置选项,应由非开发人员编辑。我们正在讨论在数据库中确实没有位置的独立站点范围内的常量。将它们放入数据库将导致无数毫无意义的查询。缓存可以缓解这种情况,但这看起来过于复杂,无法处理settings.py文件中的单行代码。

我没有注意到this dbsettings app,但它是旧的和无人维护的。我还注意到,django电子商务应用程序Satchmo包含此dbsettings应用程序的用例特定分支。我们可以在我们的网站中构建一些类似的应用程序,这些应用程序将一些设置作为键/值对存储在单个数据库表中,但它看起来像是错误的方法。为什么在不属于那里的数据库中添加一些东西,只是为了让非开发人员更易于编辑?

我们在我们的Django网站上有一个网站范围的设置列表,我们希望可由非开发人员管理员进行编辑。什么是最好的方式去做这件事?

+0

+1因为知道这可能使它更容易在VCS管理的Django项目。开发人员必须小心,否则不要提交对settings.py的本地更改。 – 2009-12-02 16:50:45

+0

缓存将缓解这(当本地设置放入数据库时​​)每个django进程的实例只有一个查询。 – Evgeny 2009-12-02 17:21:40

+0

重新启动服务器以重新加载设置,您可以直接调用“touch site.wsgi”文件,例如使用cron作业,但只有当您的wsgi进程以守护进程模式运行时,这才会起作用 – Evgeny 2009-12-02 17:26:35

有点像dbsettings(如你所说)似乎是要走的路。从reasons for existence为该项目:

并非所有设置都属于在 settings.py,因为它有一些 特别的限制:

  • 设置为项目范围内。这不仅需要应用程序混乱 settings.py,但也增加了命名冲突的可能性。

  • 整个Django实例的设置是不变的。在不重新启动应用程序的情况下,它们不能被更改为 。

  • 设置需要程序员才能更改。即使在 的情况下,如果设置对其他任何功能没有影响,情况也是如此。

如果dbsettings不为你工作,然后实现自己的,或叉它。它似乎不会太艰难。

如何把一个sitesettings.py(或其他)的地方,你的管理员可以访问,那么在settings.py做

from sitesettings import * 

这似乎是不错的,简单的,但我可能误解或过于简化您的问题:)

+1

此解决方案也不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动Apache。 – Apreche 2009-12-02 17:00:22

我实际上是dbsettings的一个粉丝, ,并且保持发布我的fork的意义,它将它与Django 1.1(实际上并不是一个很大的变化)进行了修补,其工作原理是 。看起来有人有updated it already

然而,你可能是正确的,这是你所需要的矫枉过正。我之前完成的一件事是在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的按钮不会特别困难。

+0

此解决方案不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动Apache。 – Apreche 2009-12-02 16:59:06

+0

构建可编辑此文件的前端并不会特别困难,并提供运行脚本以重新启动Apache的按钮。 – 2009-12-02 20:36:51

+1

@丹尼尔 - 尽管那时你已经进入了与dbsettings需要的同样的工作级别。 – 2009-12-03 22:13:49

如果您必须避免重新启动服务器,那么设置的逻辑位置是Dominic和Daniel说的数据库,但每次更新时都需要使缓存的设置对象无效。

看起来像是可以用Django的low level cache API重新设置缓存中的值。所有你想要的应该是可以实现与这些电话:

cache.set('settings', local_settings) 
cache.add('settings', local_settings) 
local_settings = cache.get('settings') 
cache.delete('settings')