使用非常相似的文件在apache上运行两个django应用程序(project和project_development)

时间:2011-11-21 01:02:40

标签: django apache mod-wsgi

我在Apache上使用mod_wsgi运行django应用程序,我的wsgi文件如下:

import os
import sys

sys.path.append('/home/UNAME/DP/')
sys.path.append('/home/UNAME/DP/pr1/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

我还创建了另一个应用程序pr1_developer,其wsgi为:

import os
import sys

sys.path.append('/home/UNAME/DP/')
sys.path.append('/home/UNAME/DP/pr1_developer/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

然而,在我的'views'中,'urls','models','forms'和其他python文件导入必要的类

from pr1.main.models import Country,City, Months
from pr1.employer.models import EmployerStatus
...

但是,当我尝试运行pr1_developer应用程序时,我需要在每个文件中将from pr1.main..之类的标题更改为pr1_developer.main..。否则pr1_developer会运行pr1中的模块1}}。

除此之外,我不想为每个项目创建两个不同的文件,但我怎样才能克服这些困难?

一种方法可能会写from main...而不是from pr1.main...但是,我不确定这是否是一种很好的方法。

我对任何建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

使用相同项目的两个实例是不是更容易?

devel.wsgi:

sys.path.append('/home/UNAME/devel/DP/')
sys.path.append('/home/UNAME/devel/DP/pr1/')

生产:

sys.path.append('/home/UNAME/production/DP/')
sys.path.append('/home/UNAME/production/DP/pr1/')

将Apache指向两个相应的文件夹和wsgi文件。

通过这种方式,您可以将整个代码库保存在版本控制中,将devel和checkout提交到生产环境中,而无需进行任何更改。

答案 1 :(得分:1)

tldr;使用virtualenv可能会更好。

我只是一个鸡蛋,但我认为大师会不鼓励使用sys.path。我对它的短途旅行使得我的代码在主机和项目中的可移植性降低,引入了奇怪的破坏点(例如,当一个对象具有类'pr1.main.models'和另一个'pr1.test.main时,有时相等测试会失败b / c .models')并创建了我后来难以记住的依赖项。这些努力通常是对项目或工作流程管理方面一些模糊的问题的攻击。 sys.path解决方案不值得他们引入的技术债务。

使用sys.path通常意味着某种结构问题,作为一个新手,我没有经常处理,然后不太了解。当我急于完成其他事情时,这些东西总是会出现,但我想要记住,正确地做这件事会让其他事情变得更加轻松。

像virtualenv这样的工具可能会更好地为您服务。你有一个带有初始代码的pr1环境,以及一个带有不同代码的pr1_dev环境(但是模块名称相同)。您可以使用一个终端窗口运行另一个终端窗口,另一个运行另一个当_dev中的某些内容为黄金时段做好准备时,可以在不更改其导入或名称空间引用的情况下将其移入。当然,你将不得不花时间学习另一种工具而不是推进你正在做的任何工作。

有关virtualenv的信息,请参阅http://pypi.python.org/pypi/virtualenv。 Doug Hellman还编写了mkvirtualenv(http://doughellmann.com/2008/05/01/virtualenvwrapper.html),这是一个用于管理环境的bash级脚本。