from django.conf import settings as user_settings
from . import settings as default_settings
class AppSettings:
def __getattr__(self, name):
# If the setting you want is filled by the user, let's use it.
if hasattr(user_settings, name):
return getattr(user_settings, name)
# If the setting you want has a default value, let's use it.
if hasattr(default_settings, name):
return getattr(default_settings, name)
raise AttributeError("'Settings' object has no attribute '%s'" % name)
settings = AppSettings()
import os, sys, importlib
from . import settings as user_settings
def get_local_apps():
"""Returns the locally installed apps names"""
apps = []
for app in user_settings.INSTALLED_APPS:
path = os.path.join(user_settings.BASE_DIR, app)
if os.path.exists(path) and app != __name__:
apps.append(sys.modules[app])
return apps
class AppSettings:
SETTINGS_MODULE = 'settings'
def __getattr__(self, setting_name):
# If the setting you want is filled by the user, let's use it.
if hasattr(user_settings, setting_name):
return getattr(user_settings, setting_name)
# Let's check every local app loaded by django.
for app in get_local_apps():
module_source = os.path.join(app.__path__[0], "%s.py" % self.SETTINGS_MODULE)
module_binary = os.path.join(app.__path__[0], "%s.pyc" % self.SETTINGS_MODULE)
if os.path.exists(module_source) or os.path.exists(module_binary):
module = importlib.import_module("%s.%s" % (app.__name__, self.SETTINGS_MODULE))
# Let's take the first default value for this setting we can find in any app
if hasattr(module, setting_name):
return getattr(module, setting_name)
raise AttributeError("'Settings' object has no attribute '%s'" % setting_name)
settings = AppSettings()
不如:
在我的应用程序中,我有一个单独的settings.py文件。在该文件中,我有一个get()函数,它在projects settings.py文件中进行查找,如果找不到,则返回默认值。
在我需要取苹果的地方我有:
这允许在projects settings.py中进行重写,getattr将首先检查该属性,如果找到该属性,则返回该值,或者使用在应用程序设置文件中定义的默认值。
这里有两个解决方案。对于这两种情况,您都可以在应用程序中设置
settings.py
文件并用默认值填充它们。为单个应用程序配置默认值
在代码中使用
from MYAPP import settings
,而不是from django.conf import settings
。编辑
YOURAPP/__init__.py
:为整个项目配置默认值
在代码中使用
from MYPROJECT import settings
,而不是from django.conf import settings
。编辑
MYPROJECT/MYPROJECT/__init__.py
此解决方案似乎更易于安装,但它不能保证返回良好的默认值。如果多个应用程序在其settings.py中声明同一变量,则无法确定哪个应用程序将返回您要求的默认值。
相关问题 更多 >
编程相关推荐