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

Python 如何让员工可以访问一些Django设置?,python,django,settings,Python,Django,Settings,在Django中,设置存储在settings.py文件中。此文件是代码的一部分,并进入存储库。只有开发人员处理这个文件。管理员处理模型和数据库中的数据。这是非开发人员编辑的数据,站点访问者可以在模板中看到呈现的数据 问题是,我们的网站和许多其他网站都有很多设置选项,非开发人员应该编辑这些选项。我们讨论的是在数据库中没有位置的独立站点范围常量。将它们放入数据库将导致大量无意义的查询。缓存可以缓解这一问题,但处理settings.py文件中的一行内容似乎不必要地复杂 我确实注意到了,但它是旧的,没有

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

问题是,我们的网站和许多其他网站都有很多设置选项,非开发人员应该编辑这些选项。我们讨论的是在数据库中没有位置的独立站点范围常量。将它们放入数据库将导致大量无意义的查询。缓存可以缓解这一问题,但处理settings.py文件中的一行内容似乎不必要地复杂

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


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

将sitesettings.py(或任何东西)放在管理员可以访问的地方,然后在settings.py中执行操作

from sitesettings import *
这似乎很好,也很简单,但我可能误解了你的问题,或者把你的问题过于简单化了:)

像(正如你提到的)这样的事情似乎是应该走的路。从该项目的

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

  • 设置是项目范围的。这不仅要求应用程序杂乱无章
    settings.py
    ,但也增加了命名的机会 冲突

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

  • 设置需要程序员才能更改。这甚至是真的 如果设置对任何其他功能没有影响


如果dbsettings不适合您,那么实现您自己的,或者分叉它。这看起来并不太难。

我实际上是dbsettings的忠实粉丝,并一直打算发布我的fork,将其与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
您需要库来解析YML文件

这种方法的缺点是,您需要重新启动Apache以使其接受更改


编辑以添加构建一个可以编辑此文件的前端,并提供一个运行脚本以重新启动Apache的按钮并不特别困难。

如果必须避免服务器重新启动,那么设置的一个合理位置就是数据库,正如Dominic和Daniel所说,但每次更新缓存设置对象时,都需要使其无效

看起来可以使用Django的重新设置缓存中的值。您所希望的一切都可以通过以下调用实现:

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

class Setting(models.Model):
    """Global settings for app"""
    name = models.CharField(max_length=100, null=False, blank=False)
    value = models.CharField(max_length=100, null=False, blank=False)

    def __str__(self):
        return self.name
管理员

from YOUR_APP.models import Setting
class SettingAdmin(admin.ModelAdmin):
    list_display = (
        'name',
        'value',
    )
admin.site.register(Setting, SettingAdmin)
额外费用

@register.filter
def get_setting(name):
    setting = Setting.objects.get(name=name)
    return setting.value
template.html

{% if 'setting_name'|get_setting == 'true' %}
    Display your Feature
{% endif %}

+1因为了解这一点可以更容易地在VCS中管理Django项目。开发人员必须小心不要将本地更改提交到settings.py,否则。缓存会将此情况(当本地设置放入数据库时)缓解为django进程的每个实例仅执行一个查询。要重新启动服务器以便重新加载设置,您只需调用“touch site.wsgi”文件,例如,使用cron作业,但是,只有当您的wsgi进程在守护进程模式下运行时,这才起作用。给出一些您正在讨论的管理员设置类型的示例可能会有所帮助
settings.py
用于部署时配置,因此显然存在与您在运行时尝试执行的操作不匹配的阻抗。完全放弃数据库驱动的解决方案对我来说似乎是一种过早的优化。该解决方案不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动apache。构建一个能够编辑此文件的前端并不特别困难,并提供一个按钮,该按钮运行脚本以重新启动Apache。@Daniel-尽管此时您正进入dbsettings所需的工作级别。此解决方案也不起作用,因为只有技术人员才能编辑服务器上的文件和/或重新启动Apache。