我在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...
但是,我不确定这是否是一种很好的方法。
我对任何建议表示赞赏。
答案 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级脚本。