Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中特定于应用程序的默认设置?_Python_Django - Fatal编程技术网

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