Python Django中特定于应用程序的默认设置?
我正在将我的站点划分为许多小的(希望是可重用的)应用程序,我想知道如何最好地提供最终用户可以覆盖的默认设置 我可以在任何地方做Python Django中特定于应用程序的默认设置?,python,django,Python,Django,我正在将我的站点划分为许多小的(希望是可重用的)应用程序,我想知道如何最好地提供最终用户可以覆盖的默认设置 我可以在任何地方做getattr(设置,'MYVAL',),但这并不干燥(也不漂亮) 我想到的最好的办法是 myapp/appsettings.py INSTALLED_APPS = ('my_dependency', 'myapp') MYVAL = 42 然后在settings.py中: from myapp import appsettings as MYAPP # MYAPP
getattr(设置,'MYVAL',)
,但这并不干燥(也不漂亮)
我想到的最好的办法是
myapp/appsettings.py
INSTALLED_APPS = ('my_dependency', 'myapp')
MYVAL = 42
然后在settings.py
中:
from myapp import appsettings as MYAPP # MYAPP must be UPPER CASE
INSTALLED_APPS = (.....)
INSTALLED_APPS += MYAPP.INSTALLED_APPS # hide/encapsulate sub-dependencies
MYAPP.MYVAL = 5000 # override
然后在视图代码中:
from django.conf import settings
...
print settings.MYAPP.MYVAL
这是一种合理的方式,还是我遗漏了一些明显的东西?就我而言,我不会用这种方式来干扰
已安装的应用程序。Wrt/其他设置,标准解决方案是
- 从appsettings.py文件导入全局设置
- 根据gobal设置中定义的内容在此处设置值
- 仅使用应用程序中的appsettings
myapp/appsettings.py
from django.conf import settings
ANSWER = getattr(settings, "MYAPP_ANSWER", 42)
SOMETHING_ELSE = getattr(settings, "MYAPP_SOMETHING_ELSE", None)
myapp/models.py
from myapp import appsettings
class Question(object):
answer = appsettings.ANSWER
我在上一个项目中做过这样的工作:
from django.conf import settings
My_APP_ID = getattr(settings, 'My_APP_ID', None)
USER_EMIL_Is = getattr(settings, 'USER_EMIL_Is', Flase)
XINSTALLED_APPS = [
'myproject.app',
]
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
...
]
try:
from local_settings import *
except ImportError, exp:
pass
try:
INSTALLED_APPS += XINSTALLED_APPS # defined in local_settings
except NameError:
pass
使用
它以一种很好的方式解决了这个问题,我可以在这里引用它的自述,但这有点毫无意义。我的方法是使用一个本地设置.py
文件来补充项目的设置.py
本地设置。py:
from django.conf import settings
My_APP_ID = getattr(settings, 'My_APP_ID', None)
USER_EMIL_Is = getattr(settings, 'USER_EMIL_Is', Flase)
XINSTALLED_APPS = [
'myproject.app',
]
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
...
]
try:
from local_settings import *
except ImportError, exp:
pass
try:
INSTALLED_APPS += XINSTALLED_APPS # defined in local_settings
except NameError:
pass
设置。py:
from django.conf import settings
My_APP_ID = getattr(settings, 'My_APP_ID', None)
USER_EMIL_Is = getattr(settings, 'USER_EMIL_Is', Flase)
XINSTALLED_APPS = [
'myproject.app',
]
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
...
]
try:
from local_settings import *
except ImportError, exp:
pass
try:
INSTALLED_APPS += XINSTALLED_APPS # defined in local_settings
except NameError:
pass
我对这种方法的唯一反对意见是(i)它使在appsettings中发现语法错误变得更加困难;-)(ii)查看我的代码的人不会立即理解,当我说appsettings.ANSWER
,他们应该说settings.MYAPP\u ANSWER
。。。ps:为什么您不想在已安装的应用程序中隐藏子依赖项?如果愿意,您可以使用appsettings.MYAPP\u ANSWER
,语法错误也同样明显(至少如果您在models.py中导入appsettings)。而且我不喜欢扫描分散在我的项目和virtualenv目录中的六个或更多文件,以找出安装了哪些应用程序——只是“显式优于隐式”。manage.py diffsettings
?(但我明白你的意思)看起来很好。。。我得试试。它很可爱,但可能有点神奇。。?它似乎破坏了可组合性,即,您不能通过说from.emailsettings import*,从较小的设置文件创建设置文件;从.printersettings import*
(但可能它的用例与应用程序设置不相交。)实际上我认为这仍然有效,因为这些appconf设置仅在正常的Django settings.py中没有值时使用,它们是默认值。我喜欢它们(我们在不同同事开发的几个子应用程序中使用它们),因为我可以检查conf.py以快速查看应用程序的可用设置。我的第一印象是它看起来非常冗长,如果有人签入覆盖的本地_settings.py,例如,DEBUG
,您将遇到问题。@thebjorn:您可以更选择性地选择要导入的本地_settings.py中的值。在本例中,我们使用本地设置覆盖不同环境中的默认设置,但最终用户无法覆盖它们。我们对全局配置设置也这样做,也就是说,settings/\uu init\uuuuuupy
从.db\u settings import*
中导入,它根据PROD/DEV/TEST
,外部/内部
服务器(最终来自已知服务器列表)的设置获取正确的数据库设置。然而,这些并不是应用程序应该覆盖的设置类型,这就是为什么我喜欢我建议的自动名称间隔。嗯。。由于循环依赖关系,您似乎无法从django.conf导入设置内部local_settings.py
。