在开发与生产之间分离 Django 安装的应用程序

Posted

技术标签:

【中文标题】在开发与生产之间分离 Django 安装的应用程序【英文标题】:Separating Django installed apps between Development vs Production 【发布时间】:2016-11-10 05:11:17 【问题描述】:

我有 3 个设置文件:

base.py(共享) 开发.py 生产.py

base.py 有:

INSTALLED_APPS = (

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes'
    ...

但我有一些只需要在我的开发环境中使用的应用程序,例如debug-toolbar

我在 development.py 中试过这个:

INSTALLED_APPS += (
    'debug_toolbar',
)

但得到错误:NameError: name 'INSTALLED_APPS' is not defined

设置文件是这样连接的:

__init__.py

from .base import *

try:
    from .production import *
except:
    from .development import *

如何区分我的生产/开发环境中安装的应用程序?

【问题讨论】:

显示完整的回溯 重复***.com/questions/1626326/… Dev 在您的情况下没有“看到”基础。您的代码需要在 init 中。或重组。但是导入的模块 (dev) 不会从导入模块 (init) 继承命名空间,而导入模块 (init) 恰好从 base 引入已安装的应用程序。所以...已安装的应用程序无处可见。很抱歉大写和下划线错误输入(在平板电脑键盘上),但这是这里的核心问题。 当您需要访问基本或生产DJANGO_SETTINGS_MODULE=project_name.settings.production 和生产.py 中from .base import * 的设置并覆盖任何需要更改的设置时,您不需要包级导入。 【参考方案1】:

我只是在我的 settings.py 中测试 DEBUG(假设在生产中 DEBUG == FALSE)并添加应用程序:

# settings.py
if DEBUG:
    INSTALLED_APPS += (
        # Dev extensions
        'django_extensions',
        'debug_toolbar',
    )

【讨论】:

【参考方案2】:

我自己处理过这个问题,我是这样破解的:

base.py(我的是 settings.py)

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes'
    ... )


# rest of settings.py variables ...

def _add_installed_app(app_name):
    global INSTALLED_APPS

    installed_apps = list(INSTALLED_APPS)
    installed_apps.append(app_name)
    INSTALLED_APPS = tuple(installed_apps)

ADD_INSTALLED_APP = _add_installed_app

development.py(我的是 settings_debug.py)

from base import *

ADD_INSTALLED_APP('debug_toolbar')

production.py

from base import *

【讨论】:

【参考方案3】:

使用 extend 将一个列表附加到另一个列表,并将已安装的应用程序声明为列表(方括号 [])而不是元组 (())

【讨论】:

以上是关于在开发与生产之间分离 Django 安装的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

django 与 vue 的完美结合 实现前后端的分离开发之后在整合

Node JS后端项目开发与生产环境总结

mysql读写分离

Python前后端分离开发Vue+Django REST framework实战

django 开发之前后端分离开发模式

django 前后端分离开发解决跨域问题