如何使员工可以访问某些Django设置?
在Django中,设置存储在settings.py文件中。该文件是代码的一部分,并进入存储库。只有开发人员处理这个文件。管理员处理模型,数据库中的数据。这是非开发人员编辑的数据,访问者在模板中看到的数据。如何使员工可以访问某些Django设置?
事情是,我们的网站,和其他许多人,有很多设置选项,应由非开发人员编辑。我们正在讨论在数据库中确实没有位置的独立站点范围内的常量。将它们放入数据库将导致无数毫无意义的查询。缓存可以缓解这种情况,但这看起来过于复杂,无法处理settings.py文件中的单行代码。
我没有注意到this dbsettings app,但它是旧的和无人维护的。我还注意到,django电子商务应用程序Satchmo包含此dbsettings应用程序的用例特定分支。我们可以在我们的网站中构建一些类似的应用程序,这些应用程序将一些设置作为键/值对存储在单个数据库表中,但它看起来像是错误的方法。为什么在不属于那里的数据库中添加一些东西,只是为了让非开发人员更易于编辑?
我们在我们的Django网站上有一个网站范围的设置列表,我们希望可由非开发人员管理员进行编辑。什么是最好的方式去做这件事?
有点像dbsettings(如你所说)似乎是要走的路。从reasons for existence为该项目:
并非所有设置都属于在
settings.py
,因为它有一些 特别的限制:
设置为项目范围内。这不仅需要应用程序混乱
settings.py
,但也增加了命名冲突的可能性。整个Django实例的设置是不变的。在不重新启动应用程序的情况下,它们不能被更改为 。
设置需要程序员才能更改。即使在 的情况下,如果设置对其他任何功能没有影响,情况也是如此。
如果dbsettings不为你工作,然后实现自己的,或叉它。它似乎不会太艰难。
如何把一个sitesettings.py(或其他)的地方,你的管理员可以访问,那么在settings.py做
from sitesettings import *
这似乎是不错的,简单的,但我可能误解或过于简化您的问题:)
此解决方案也不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动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的按钮不会特别困难。
此解决方案不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动Apache。 – Apreche 2009-12-02 16:59:06
构建可编辑此文件的前端并不会特别困难,并提供运行脚本以重新启动Apache的按钮。 – 2009-12-02 20:36:51
@丹尼尔 - 尽管那时你已经进入了与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')
+1因为知道这可能使它更容易在VCS管理的Django项目。开发人员必须小心,否则不要提交对settings.py的本地更改。 – 2009-12-02 16:50:45
缓存将缓解这(当本地设置放入数据库时)每个django进程的实例只有一个查询。 – Evgeny 2009-12-02 17:21:40
重新启动服务器以重新加载设置,您可以直接调用“touch site.wsgi”文件,例如使用cron作业,但只有当您的wsgi进程以守护进程模式运行时,这才会起作用 – Evgeny 2009-12-02 17:26:35