代码之家  ›  专栏  ›  技术社区  ›  Apreche

如何让员工可以访问一些django设置?

  •  9
  • Apreche  · 技术社区  · 15 年前

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

    问题是,我们的站点和许多其他站点都有许多设置选项,这些选项应该由非开发人员编辑。我们讨论的是独立的站点范围常量,它们在数据库中实际上没有位置。将它们放在数据库中会导致许多无意义的查询。缓存可以缓解这种情况,但对于处理SETTINGS.py文件中的一行可以完成的操作来说,这似乎不必要地复杂。

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

    我们的django站点上有一个站点范围的设置列表,我们希望非开发人员管理员可以对其进行编辑。最好的方法是什么?

    4 回复  |  直到 10 年前
        1
  •  6
  •   Dominic Rodger    10 年前

    类似的东西 dbsettings (正如你所提到的)似乎是该走的路。来自 reasons for existence 对于该项目:

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

    • 设置在项目范围内。这不仅需要应用程序杂乱无章 设置Py 但也增加了命名的机会 冲突。

    • 设置在Django的整个实例中都是常量。他们不能 已更改,但未重新启动应用程序。

    • 设置需要程序员才能更改。即使是这样 如果设置对其他任何内容没有功能影响。

    如果dbsettings对您不起作用,那么就实现您自己的,或者分叉它。看起来不太费力。

        2
  •  6
  •   Daniel Roseman    15 年前

    我是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,这并不特别困难。

        3
  •  1
  •   Evgeny    15 年前

    如果必须避免服务器重新启动,那么设置的逻辑位置就是数据库,如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')
    
        4
  •  0
  •   Aaron Lockey    15 年前

    把sitesettings.py(或其他什么)放在管理员可以访问的地方,然后放在settings.py中如何?

    from sitesettings import *
    

    这看起来很好也很简单,但我可能误解了你的问题,或者过于简单化了。