Python 如何让员工可以访问一些Django设置?
在Django中,设置存储在settings.py文件中。此文件是代码的一部分,并进入存储库。只有开发人员处理这个文件。管理员处理模型和数据库中的数据。这是非开发人员编辑的数据,站点访问者可以在模板中看到呈现的数据 问题是,我们的网站和许多其他网站都有很多设置选项,非开发人员应该编辑这些选项。我们讨论的是在数据库中没有位置的独立站点范围常量。将它们放入数据库将导致大量无意义的查询。缓存可以缓解这一问题,但处理settings.py文件中的一行内容似乎不必要地复杂 我确实注意到了,但它是旧的,没有维护。我还注意到django电子商务应用程序Satchmo包含了这个dbsettings应用程序的一个特定于用例的分支。我们可以在我们的网站中构建类似的东西,一个在单个数据库表中以键/值对的形式存储某些设置的应用程序,但这看起来确实是错误的方法。为什么要在数据库中放一些不属于那里的东西,只是为了让非开发人员更容易编辑它Python 如何让员工可以访问一些Django设置?,python,django,settings,Python,Django,Settings,在Django中,设置存储在settings.py文件中。此文件是代码的一部分,并进入存储库。只有开发人员处理这个文件。管理员处理模型和数据库中的数据。这是非开发人员编辑的数据,站点访问者可以在模板中看到呈现的数据 问题是,我们的网站和许多其他网站都有很多设置选项,非开发人员应该编辑这些选项。我们讨论的是在数据库中没有位置的独立站点范围常量。将它们放入数据库将导致大量无意义的查询。缓存可以缓解这一问题,但处理settings.py文件中的一行内容似乎不必要地复杂 我确实注意到了,但它是旧的,没有
我们在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。