0
我在Ubuntu上使用django 1.11,但非虚拟python有1.6。还有其他应用程序使用1.6。当我通过Apache mod_wsgi运行我的应用程序时,它使用1.6而不是1.11,并且我得到堆栈跟踪。Django无法在virutalenv中使用django版本
的Apache的conf:
WSGIPythonPath /home/wondi/envs/my_app
<VirtualHost *:80>
ServerName server.com
ServerAdmin [email protected]
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
WSGIDaemonProcess server.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup server.com
WSGIPassAuthorization On
WSGIScriptAlias /my_app /home/wondi/envs/my_app/my_app/wsgi.py
<Directory "/home/wondi/envs/my_app/my_app/">
<Files wsgi.py>
Order deny,allow
Require all granted
</Files>
</Directory>
<Directory /home/wondi/envs/my_app/app/static/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
IndexOptions FancyIndexing
</Directory>
...
</VirtualHost>
程序my_app \ wsgi.py:
import os
import sys
from django.core.wsgi import get_wsgi_application
import site
env_path = '/home/wondi/envs/lib/python2.7/site-packages'
# we add currently directory to path and change to it
working_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(working_dir)
sys.path = [working_dir] + sys.path
# Append paths
site.addsitedir(env_path)
sys.path.append('/home/wondi/envs/')
sys.path.append('/home/wondi/envs/my_app/')
os.environ["DJANGO_SETTINGS_MODULE"] = "my_app.settings"
activate_this = "/home/wondi/envs/bin/activate_this.py"
execfile(activate_this, dict(__file__=activate_this))
application = get_wsgi_application()
堆栈跟踪:
Django Version: 1.6.1
Python Version: 2.7.6
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.gis',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_gis',
'corsheaders',
'my_app']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
99. resolver_match = resolver.resolve(request.path_info)
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
337. for pattern in self.url_patterns:
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in url_patterns
365. patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in urlconf_module
360. self._urlconf_module = import_module(self.urlconf_name)
File "/usr/lib/python2.7/dist-packages/django/utils/importlib.py" in import_module
40. __import__(name)
File "/home/wondi/envs/my_app/my_app/urls.py" in <module>
19. from rest_framework.urlpatterns import format_suffix_patterns
File "/home/wondi/envs/lib/python2.7/site-packages/rest_framework/urlpatterns.py" in <module>
5. from rest_framework.compat import RegexURLResolver, include
File "/home/wondi/envs/lib/python2.7/site-packages/rest_framework/compat.py" in <module>
12. from django.apps import apps
Exception Type: ImportError at/
Exception Value: No module named apps
是疗法e我错过了什么或者可以做什么来解决这个问题?
我会说,你应该修改的sys.path之前激活的virtualenv或导入任何内容你导入django.core.wsgi的那一分钟,你从你的virtualenv中导入了django。当你运行激活(不应该是一个shell脚本?)你修改你的env变量,覆盖你设置的变量。所以尝试重新排序你的wsgi.py(字面意思是反向)。 – cowbert
我完全明白。这正是你所说的。它正在工作。你能把它作为答案吗? – wondie
阅读http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html,其中显示了使用mod_wsgi设置虚拟环境的首选方式。 –