Python中Django项目里多个App,每个App里都有自己的settings.py如何生效?

如下图的方法运行 Django 应用,firstapp 里有自己的 settings 文件,其中导入了 mysite.settings,也定制了私有配配置项,firstapp.server 里传给 WSGIServer 的 application 是 mysite.wsgi.application,这个 application 在 django 内生成过程中需要配置文件的地方用的应该是 mysite.settings 配置文件吧? mysite.settings.INSTALLED_APPS 里没有添加 firstapp 也没有设置 firstapp 的 urls。小弟有个疑问:firstapp.settings 里的配置项是怎么生效的?
ps:这么拉起来能够正常访问 firstapp 应用的。
http://imgur.com/XRUuEGg
http://imgur.com/c11qGGo
Python中Django项目里多个App,每个App里都有自己的settings.py如何生效?


2 回复

在Django项目中,每个App里放一个settings.py并不是标准做法,Django的设计是项目根目录下一个全局的settings.py。如果你想让每个App有自己的配置,可以这样处理:

方案一:使用Django的AppConfig(推荐) 在每个App的apps.py中定义配置:

# myapp/apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = "我的应用"
    
    # App特定配置
    MYAPP_SETTING_1 = 'value1'
    MYAPP_SETTING_2 = 100
    
    def ready(self):
        # 初始化代码
        pass

然后在__init__.py中设置:

# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'

方案二:创建配置模块 在每个App下创建config.py

# myapp/config.py
SETTINGS = {
    'FEATURE_ENABLED': True,
    'MAX_ITEMS': 50,
    'API_TIMEOUT': 30,
}

在需要的地方导入:

from myapp.config import SETTINGS
value = SETTINGS['MAX_ITEMS']

方案三:使用django-constance(动态配置) 如果需要运行时修改配置:

pip install django-constance
# settings.py
INSTALLED_APPS = [
    'constance',
]

CONSTANCE_CONFIG = {
    'MYAPP_SETTING': ('default_value', '描述'),
}

为什么不用多个settings.py

  1. Django的配置系统是全局单例的
  2. 多个settings.py会导致配置分散,难以管理
  3. 环境变量、部署配置会变得复杂

实际项目中的做法:

# 在全局settings.py中组织App配置
MYAPP_CONFIG = {
    'option1': True,
    'option2': 'value',
}

ANOTHER_APP_CONFIG = {
    'setting': 100,
}

然后在App中通过from django.conf import settings访问:

config = settings.MYAPP_CONFIG

一句话建议: 用AppConfig或独立config模块代替多个settings.py文件。


sorry 各位,这个问题不准确。完整的代码是在 firstapp 里自定义了一个 manage.py 命令,里面调用了 server.start_web_server,在用 manage.py + 自定义命令时指定了–settings=firstapp.settings。
因为是在分析别人的代码,在这个地方卡了一段时间,自己掉坑里把这个给疏忽了。
抱歉了。

回到顶部