【问题标题】:Django Apache wsgi virtualenv import errorDjango Apache wsgi virtualenv 导入错误
【发布时间】:2012-11-25 01:04:38
【问题描述】:

我正在尝试使用 WSGI 部署在 Apache 上部署 Django(位于 virtualenv 中)。我正在关注https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/ 的默认教程

wsgi.py(Django 生成的默认文件,删除了 cmets):

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

apache2.conf(与 Debian 中的 httpd.conf 相同)。将此附加到末尾:

WSGIScriptAlias / /home/user/Desktop/expofit/expofit_hg/py/server/server/wsgi.py
WSGIDaemonProcess example.com python-path=/home/user/Desktop/expofit/expofit_hg/py/server:/home/user/Desktop/expofit/expofit_env/lib/python2.7/site-packages
WSGIProcessGroup example.com

<Directory /home/user/Desktop/expofit/expofit_hg/py/server/server>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

Alias /static/ /home/user/Desktop/expofit/expofit_hg/py/server/server/static

<Directory /home/user/Desktop/expofit/expofit_hg/py/server/server/static>
Order deny,allow
Allow from all
</Directory>

但是,这以错误结束:

[Thu Dec 06 17:08:40 2012] [error] [client 192.168.56.1] ImportError: No module named django.core.wsgi

看来标准的python是可以访问的,因为

import os

不会产生错误。所以似乎从 virtualenv 导入的模块是不可导入的。 教程说:

如果您使用上述配置,则需要进一步更改 守护进程模式是你不能使用 WSGIPythonPath;相反,你应该 使用 WSGIDaemonProcess 的 python-path 选项,例如:

WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages
WSGIProcessGroup example.com

我错过了什么?

【问题讨论】:

    标签: django mod-wsgi wsgi django-wsgi


    【解决方案1】:

    问题出在权限上。一开始我没有检查用户是谁,权限是什么,但是,当我将权限777更改为所有包含Django代码文件的目录时,它就开始工作了。

    我知道一个人必须尽可能小心使用权限,并且为所有内容提供 777 并不是最好的方法,但应该检查如何以最小的权限更改使其工作。但是,它解决了问题中的问题。

    【讨论】:

      【解决方案2】:

      对于单个应用程序,这是最容易开箱即用的方法,请参阅http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Baseline_Environment 这或使用 WSGIPythonPath 都不能仅用于虚拟主机,但必须是全局的。

      WSGIPythonHome [path to virtualenv folder]
      

      如果您有多个应用程序 - 使用 sys.path 将您的 virtualenv 的 site-packages 文件夹附加到 wsgi.py 的顶部似乎是最简单的方法,请参阅http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments

      【讨论】:

      • 按照你的目的和教程的建议做了。以无穷无尽的结尾:Apache 日志中的“ImportError: No module named site”。将代码更改为以前的代码,但日志不断出现,wsgi.py 中不再有“导入站点”
      • 那么你使用的 mod_wsgi 是针对不同版本的 Python 编译的,而不是虚拟环境使用的,或者你填充了你设置的 WSGIPythonHome。因为如果使用 mod_wsgi 3.4,而不是 WGSIPythonHome,则使用守护程序模式,请使用 WSGIDaemonProcess 指令的 python-home 选项。
      • @GrahamDumpleton 但我在WSGIDaemonProcess 指令code.google.com/p/modwsgi/wiki/… 中没有看到python-home 选项
      • 去阅读blog.dscpl.com.au/2014/09/… 原始文档已经过时了。
      【解决方案3】:

      您的环境与我认为的 apache 不同。
      使用 easy_install 或 pip 安装 django "globaly"

      或将 .virtualenv pythonpath 添加到 mod_wsgi 配置

      WSGIPythonPath 目录|directory-1:directory-2:

      MOD_wsgi config

      【讨论】:

      • 我想在守护程序模式下使用 wsgi,并且在 Django 文档中指定在这些情况下“WSGIPythonPath”不起作用,但必须使用“WSGIDaemonProcess example.com python- path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages"
      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2012-01-29
      • 2012-02-05
      • 1970-01-01
      • 2013-05-03
      • 2016-07-07
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多