【问题标题】:ImportError with Django mod_wsgiImportError 与 Django mod_wsgi
【发布时间】:2014-11-10 15:13:56
【问题描述】:

我想将一个 Django 项目从测试服务器移动到 Apache(CentOS 上的版本 2.2.15)。我使用 [1] 安装了 mod_wsgi,并尝试使用 [2] 将我的项目挂载为 wsgi 应用程序。

我按照 Hello World 示例(有用的 SO 线程 [3])将测试 wsgi.py 文件放在与我现有的 Django 项目文件 (wsgi.py) 相同的目录中。这有效(例如,我可以通过 wget 访问)。

<VirtualHost *:80>
   DocumentRoot <abs_path>/myproject/myproject
   WSGIScriptAlias /wsgi  <abs_path>/myproject/myproject/test_wsgi.wsgi
</VirtualHost>

有了这个,我根据 mod_wsgi 和 Django 文档 [2,4] 对 Apache 配置文件进行了修改以指向我的 Django 项目 wsgi 文件(如下)。

WSGIPythonPath <abs_path>/myproject/myproject

<VirtualHost *:80>

   DocumentRoot <abs_path>/myproject/myproject
   WSGIScriptAlias /django  <abs_path>/myproject/myproject/wsgi.py

   <Directory <abs_path>/myproject/myproject>
            <Files wsgi.py>
                    # Require all granted
                    Order deny,allow
                    Allow from all
            </Files>
    </Directory>

</VirtualHost>

这会引发“500 Internal Server Error:”“ImportError: No module named django.core.wsgi”


mod_wsgi 是针对 Python 2.7 编译的,它安装了 Django [5]。

ldd mod_wsgi.so 
linux-vdso.so.1 =>  (0x00007fff3ed30000)
libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0 (0x00007f641e11d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f641dee8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f641dce4000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f641dae1000)
libm.so.6 => /lib64/libm.so.6 (0x00007f641d85c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f641d4c9000)
/lib64/ld-linux-x86-64.so.2 (0x0000003c14e00000)

基于[6],我在wsgi.py中添加了python2.7站点包的路径:

# add the myproject project path into the sys.path
sys.path.append('<PATH_TO_MY_DJANGO_PROJECT>/myproject')
# add the python2.7 site-packages path to the sys.path
sys.path.append('<PATH_TO_python2.7>/Lib/site-packages')

我还在httpd.conf中添加了python2.7的路径:

WSGIPythonPath <PATH_TO_PROJECT>:<PATH_TO_python2.7>/Lib/site-packages

我仍然收到“500 Internal Server Error:”“ImportError: No module named django.core.wsgi”

有什么建议吗?


[1]http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide

[2]http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide

[3]Hello World in mod_wsgi

[4]https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/

[5]mod_wsgi isn't honoring WSGIPythonHome

[6]ImportError: No module named django.core.wsgi Apache + VirtualEnv + AWS + WSGI

【问题讨论】:

  • 查看/var/log/apache*.log中的日志
  • 你在 django 设置中设置了ALLOWED_HOSTS 吗?
  • 日志显示---“ImportError: No module named django.core.wsgi.”尝试通过附加到 sys.path() 来解决此链接中讨论的问题 --- stackoverflow.com/questions/14927345/…。还没有工作,但正在研究这个。我没有设置 ALLOWED_HOSTS。

标签: python django apache mod-wsgi


【解决方案1】:

去阅读实际的 Django 文档。在那里,您将看到设置 Python 模块搜索路径的要求。你不应该有这样做的证据。

另外,不要将 DocumentRoot 设置为 Django 项目的父目录。您正在向安全问题敞开大门。更重要的是,因为您将 Django 应用程序安装在子 URL 上,这意味着您的项目源代码(包括带有数据库密码的设置文件等)现在可以由站点根目录的远程用户下载。

【讨论】:

  • 谢谢,格雷厄姆。做过某事。在我上面的帖子中详细说明:在其他线程中报告“ImportError:没有名为 django.core.wsgi 的模块”。尝试使用您和其他人以前制定的策略推荐的方法来解决它。
  • 您指定的路径中真的有“Lib”而不是“lib”吗?你启用了 SELinux 吗?运行 Apache 的用户可以访问/读取目录吗?
  • 知道了,它是#3:python 2.7 站点包的权限问题。解决了这个问题,它奏效了。
猜你喜欢
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2011-04-04
  • 2012-08-24
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多