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

时间:2015-05-13 22:43:55

标签: python virtualenv virtualenvwrapper install.packages

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

  • (env_dev)进行开发
  • (env_test)进行测试

我希望在这两个虚拟环境中执行不同的配置。 在我的测试环境中会出现库或数据包(如硒),在开发环境中可能不需要这样做......

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

需求文件(root_project / requirements)

我有文件:

  • root_project / requirements / base.txt在哪里将是所有环境的公共包。其他需求文件将继承它
  • root_project / requirements / development.txt,只是开发本地环境所需的包
  • root_project / requirements / production.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文件夹中创建settings文件夹,以管理每个环境的不同设置文件

root_project / settings 将包含:

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

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

development.py用于本地开发。

testing.py用于测试。

production.py将在生产环境中使用。

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

文件__init__.pydevelopment.pytesting.pyproduction.pystaging.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文件和预先激活文件,如follow < / p>

在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文件,而不是preactivate。

当我想检查所有这个过程是否有效时,激活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进行了所有这些过程以防万一。

感谢。 最诚挚的问候

2 个答案:

答案 0 :(得分:1)

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

当然,更快的替代方法是将env var更改为export DJANGO_SETTINGS_MODULE="settings.testing"

这取决于你对目录结构的要求。

答案 1 :(得分:0)

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

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

OR

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

这应该有用。