Django无法找到本地安装的Python模块

时间:2014-11-24 19:16:23

标签: python django apache

我正在运行一个托管在共享服务器上的基于Django的网站(即我只有一个有限的帐户,没有管理员权限)。服务器的管理员为Python 2.7安装了Django模块,但现在我想添加一个名为django-bleach的第三方Django库。所以我使用

在本地安装它
pip install --user django-bleach

然后,按照in the django-bleach documentation的说明,我添加了' django-bleach'到settings.py中的INSTALLED_APPS列表。但是,当我触摸wsgi.py让Apache重新加载我的代码时,我的Apache日志中出现了ImportError。通常这意味着我尝试导入的模块不在PYTHONPATH中,因此我在print sys.path中添加了wsgi.py语句。这就是:

[Mon Nov 24 13:44:58 2014] [error] sys.path is: ['/extra/www/html/quotes/quotes_django', '/opt/rh/python27/root/usr/lib64/python2.7/site-packages', 
'/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', 
'/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages',
'/users/ejt64/.local/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages']
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Target WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Exception occurred processing WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Mon Nov 24 13:44:58 2014] [error] Traceback (most recent call last):
[Mon Nov 24 13:44:58 2014] [error]   File "/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py", line 17, in <module>
[Mon Nov 24 13:44:58 2014] [error]     application = get_wsgi_application()
[Mon Nov 24 13:44:58 2014] [error]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Mon Nov 24 13:44:58 2014] [error]     django.setup()
[Mon Nov 24 13:44:58 2014] [error]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/__init__.py", line 21, in setup
[Mon Nov 24 13:44:58 2014] [error]     apps.populate(settings.INSTALLED_APPS)
[Mon Nov 24 13:44:58 2014] [error]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 85, in populate
[Mon Nov 24 13:44:58 2014] [error]     app_config = AppConfig.create(entry)
[Mon Nov 24 13:44:58 2014] [error]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/config.py", line 87, in create
[Mon Nov 24 13:44:58 2014] [error]     module = import_module(entry)
[Mon Nov 24 13:44:58 2014] [error]   File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
[Mon Nov 24 13:44:58 2014] [error]     __import__(name)
[Mon Nov 24 13:44:58 2014] [error] ImportError: No module named django_bleach

请注意,/users/ejt64/.local/lib/python2.7/site-packages/目录(在sys.path中出现三次)是我安装了django-bleach的用户本地Python位置。我使这个目录具有全局可读性,以防Apache进程遇到访问我的目录的权限问题。那我怎么能得到一个ImportError?

它必须与WSGI / Django有关,因为如果我只是在我的Django app目录中运行Python,我可以这样做:

Python 2.7.5 (default, Dec  3 2013, 08:35:16) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django_bleach
>>> 

但我的Django应用程序无法以某种方式找到django_bleach模块,即使它正在寻找合适的位置。

其他信息:我的wsgi.py只是django-admin startproject生成的标准文件,加上打印声明:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "quotes_django.settings")

import sys
print >>sys.stderr, "sys.path is: " + str(sys.path)

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

2 个答案:

答案 0 :(得分:2)

好吧,我终于解决了我的问题。事实证明,尽管/users/ejt64/.local/lib/python2.7/site-packages/在由WSGI搜索的PYTHONPATH上,但我忘记了沿着该路径生成其中一个目录 - 可执行文件,因此Apache用户无法&#39;访问它。

虽然所有目录和文件都是世界可读,但用户无法读取世界可读文件,除非它对包含它的所有目录都具有执行权限,并且我的主目录(/users/ejt64)是世界可读的,但不是世界可执行的。一旦我将这个目录设为可执行的,ImportError就会消失。

如果我能在Apache / WSGI / Python尝试读取PYTHONPATH上的目录但是由于权限无法访问它时,会发现错误消息,这肯定会很好。

答案 1 :(得分:-1)

~/.local/lib/python2.7/site-packages/

相对于运行apache的用户。什么用户正在运行apache?通常,apache作为默认用户'nobody'或'apache'运行。拥有'〜'的相对路径将指向运行apache的用户的主目录。

我建议使用virtualenv或指定本地pip包的绝对路径。进入您的站点包目录并运行pwd将告诉您绝对路径。如果运行apache的用户无法对它们进行读/写/执行,则可能需要更改pip包和目录的权限。

当您放入Python REPL时,它可以正常运行,因为您正在以用户身份执行所有操作,并且“〜”指向您的主目录。

如果您有权编辑服务器上的apache配置文件,我建议您查看这个Django文档, https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-a-virtualenv 如果您不使用virtualenv事件,则仍需要将此设置相应地设置为本地site-packages目录的绝对路径。

WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages