项目中每个虚拟环境的不同settings.py

问题描述 投票:0回答:2

我有一个项目,其中存在两个虚拟环境,如下所示:

  • (env_dev)
    发展
  • (env_test)
    用于测试

我想在这两个虚拟环境中执行不同的配置。 在我的测试环境中会使用库或数据包(例如 selenium),而开发环境中可能不需要这些库或数据包,所以......

根据上面提到的,我有以下与这种方式的需求文件和设置文件相关的目录结构:

需求文件(root_project/requirements)

我有文件:

  • root_project/requirements/base.txt 其中将包含所有环境通用的所有包。其他需求文件将继承它
  • root_project/requirements/development.txt,只是开发本地环境需要的包
  • root_project/requirements/development.txt,只是生产环境的包
  • root_project/requirements/testing.txt,只是测试环境需要的包
  • root_project/requirements/staging.txt,临时环境的包,以防万一

此外,之后我将包写入每个需求文件中, 我继续以这种方式在测试和开发环境中安装软件包:

$ workon env_dev
$ pip install -r requirements/development.txt

$ workon env_test
$ pip install -r requirements/testing.txt

每个虚拟环境有不同的设置(测试和开发)

然后,我继续在 root_project 文件夹中创建设置文件夹,以管理每个环境的不同设置文件

root_project/settings 将有:

__init__.py
文件使该文件夹成为 Python 包

base.py
将包含所有环境中常见的所有设置。其他设置文件继承此文件。

development.py
是为了当地发展。

testing.py
用于测试。

production.py
将用于生产环境。

staging.py
以防在我的项目的生产服务器上运行临时版本。

文件

__init__.py
development.py
testing.py
production.py
staging.py
,我已经编辑了这些从 base.py 继承的行(仍然没有创建):

# -*- coding: utf-8 -*-
from .base import * 

并且,在我的 root_project/name_project/ django 中默认创建

settings.py
文件。 这个文件,我已经移动到 root_project/settings 目录,并重命名为 base.py,因为这个文件 settings.py 将是我的 base.py

使用 virtualenvwrapper,我指定该文件将与特定的虚拟环境一起使用:

env_test
将与testing.py一起使用测试

env_dev
将与development.py一起使用

在每个虚拟环境(测试和开发)的每个路径 [$VIRTUAL_ENV/bin] 中,我配置要使用的文件(development.py 和 settings.py),将我的注意力集中在 postactivate 文件和 predeactivate 文件中,例如 follow

在env_dev环境中

转到

$VIRTUAL_ENV/bin
路径,我编辑 postactivate 文件添加:

export DJANGO_SETTINGS_MODULE="taskbuster.settings.development"

我还转到

$VIRTUAL_ENV/bin
路径并编辑预停用文件添加:

unset DJANGO_SETTINGS_MODULE

在env_test环境中

转到

$VIRTUAL_ENV/bin
路径,我编辑 postactivate 文件添加:

export DJANGO_SETTINGS_MODULE="taskbuster.settings.testing"

我只是在 postactivate 文件中添加,而不是在 predeactivate 中添加。

当我想检查所有这些过程是否有效时,激活 env_dev 环境我得到这个输出

(env_dev)➜  taskbuster_project  ./manage.py runserver
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/core/management/__init__.py", line 303, in execute
    settings.INSTALLED_APPS
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/conf/__init__.py", line 48, in __getattr__
    self._setup(name)
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/conf/__init__.py", line 44, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/site-packages/django/conf/__init__.py", line 92, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/home/bgarcial/.virtualenvs/tb_dev/lib/python3.4/importlib/__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2231, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2189, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 2231, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2201, in _find_and_load_unlocked
ImportError: No module named 'taskbuster.settings'
(env_dev)➜  taskbuster_project

与我的env_test环境发生同样的情况 我可以有一些错误配置吗?

请大家原谅这个问题的行数。 作为附加数据,我一直在这个完整的教程中所做的所有过程http://www.marinamele.com/taskbuster-django-tutorial/settings- different-environments-version-control以防万一。

谢谢。 最好的问候

python virtualenv virtualenvwrapper
2个回答
1
投票

您已设置

export DJANGO_SETTINGS_MODULE="taskbuster.settings.testing"
,但上面您说设置位于
root_project/settings
下。因此,如果我正确理解您的设置,您需要将设置目录移至名为
taskbuster
的目录下。

当然,更快的选择是将环境变量更改为

export DJANGO_SETTINGS_MODULE="settings.testing"

这取决于您想要的目录结构。


0
投票

编辑后激活和预停用后,您必须重新激活环境。 当你在 env_dev 中时,你可以这样做:

$workon env_test   //change to another env and come back
$Workon env_dev

$deactivate  //just deactivate and activate the concerned env
$workon env_dev

这应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.