我有一个项目,其中存在两个虚拟环境,例如:
(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 文件夹中创建设置文件夹,以管理每个环境的不同设置文件
root_project/settings将具有:
__init__.py
文件以使该文件夹成为 Python 包
base.py
将包含所有环境中通用的所有设置。其他设置文件继承自该文件。
development.py
是为了当地的发展。
testing.py
是为了测试。
production.py
将在生产环境中使用。
staging.py
以防万一在我的项目的生产服务器上运行暂存版本。
文件__init__.py
, development.py
,和testing.py
,我用这些行编辑了从 base.py 继承的文件(仍然没有创建):production.py
staging.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 文件中,如下所示
在 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中所做的所有这些过程以防万一。
谢谢。此致