2010-04-18 63 views
7

我剛剛在virtualenv上設置了一個django應用程序,部署使用結構腳本順利進行,但現在.wsgi不工作,我試過了互聯網上的所有變體,但沒有運氣。我.wsgi文件是:django + mod_wsgi在virtualenv不起作用

import os 
import sys 
import django.core.handlers.wsgi 

# put the Django project on sys.path 
root_path = os.path.abspath(os.path.dirname(__file__) + '../') 
sys.path.insert(0, os.path.join(root_path, 'kcdf')) 
sys.path.insert(0, root_path) 

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

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

我不斷收到同樣的錯誤:

[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] mod_wsgi (pid=16938): Exception occurred processing WSGI script '/home/kcdfweb/webapps/kcdf.web/releases/current/kcdf/apache/kcdf.wsgi'. 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] Traceback (most recent call last): 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 230, in __call__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self.load_middleware() 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 33, in load_middleware 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  for middleware_path in settings.MIDDLEWARE_CLASSES: 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/utils/functional.py", line 269, in __getattr__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self._setup() 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 40, in _setup 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  self._wrapped = Settings(settings_module) 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 75, in __init__ 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159]  raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e) 
[Sun Apr 18 12:44:30 2010] [error] [client 41.215.123.159] ImportError: Could not import settings 'kcdf.settings' (Is it on sys.path? Does it have syntax errors?): No module named kcdf.settings 

我的虛擬環境是/ home/user中/ webapps /下kcdfweb 我的應用程序是/ home /用戶/ webapps中/kcdf.web/releases/current/project_name 我的wsgi文件home/user/webapps/kcdf.web/releases/current/project_name/apache/project_name.wsgi

回答

1

您需要添加兩個以上的目錄你的wsgi文件,而不是:

root_path = os.path.abspath(os.path.dirname(__file__) + '../') 

你應該有

root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../', '../')) 

...作爲你的WSGI文件是在一個名爲apache目錄,你的項目文件夾下。

+0

試過,它沒有工作,可能是值得一提的是,當我創建的virtualenv體外的樣品Django項目,並試圖運行它我得到: jwesonga @ KCDF:〜/ $測試儀出口DJANGO_SETTINGS_MODULE = tester.settings jwesonga @ kcdf:〜/ tester $ django-admin.py runserver 錯誤:無法導入設置'tester.settings'(它是否在sys.path?是否有語法錯誤?):沒有名爲tester.settings的模塊 – jwesonga 2010-04-18 14:14:47

0

如果您使用的是virtualenv,則需要在WSGI腳本中激活它才能正確設置路徑。

root_path = os.path.abspath(os.path.dirname(__file__) + '../') 
activate_this = os.path.join(root_path, "bin/activate_this.py") 
execfile(activate_this, dict(__file__=activate_this)) 
+1

不鼓勵在mod_wsgi中使用activate_this.py,因爲它確實會在sys.prefix中弄亂,這在技術上可能會導致某些代碼出現問題。閱讀'http://code.google.com/p/modwsgi/wiki/VirtualEnvironments'。 – 2010-04-18 22:45:24

+0

另外,activate_this是不必要的。你真正需要做的就是在virtualenv網站包目錄上調用site.addsitedir()。 – 2010-04-19 13:25:53

+3

不,site.addsitedir()並不總是足夠的,特別是如果您在創建虛擬環境時未使用--no-site-packages。這是因爲site.addsitedir()在sys.path的末尾添加了新目錄,因此標準Python安裝中的任何內容仍然優先。該腳本的目的是對sys.path重新排序,以便新的目錄在開始時優先。請閱讀mod_wsgi網站上提到的文檔。 – 2010-04-19 22:51:28

0

您的「kcdf」目錄中是否有__init__.py文件?沒有這個你的設置文件不能被導入。

另外,如果您希望能夠從virtualenv中導入內容,您應該在virtualenv的site-packages目錄上調用site.addsitedir()。詳情請參閱the mod_wsgi docs。雖然如果它甚至不能導入你的設置,我不認爲這是你目前的問題。

7

我建議你看看docs與mod_wsgi一起使用Virtualenv。他們提供了一些替代方法來連接你的virtualenv,這可能對你更好。