Django can';找不到本地安装的Python模块
我正在运行一个基于Django的网站,该网站托管在共享服务器上(即,我只有一个有限的帐户,没有管理员权限)。服务器管理员安装了Python2.7的Django模块,但现在我想添加一个我找到的第三方Django库,名为Django bleach。所以我在本地安装了它,使用Django can';找不到本地安装的Python模块,python,django,apache,Python,Django,Apache,我正在运行一个基于Django的网站,该网站托管在共享服务器上(即,我只有一个有限的帐户,没有管理员权限)。服务器管理员安装了Python2.7的Django模块,但现在我想添加一个我找到的第三方Django库,名为Django bleach。所以我在本地安装了它,使用 pip install --user django-bleach 然后,按照说明,我在settings.py中将“django漂白剂”添加到我的已安装应用程序列表中。然而,当我点击wsgi.py让Apache重新加载我的代码时
pip install --user django-bleach
然后,按照说明,我在settings.py
中将“django漂白剂”添加到我的已安装应用程序列表中。然而,当我点击wsgi.py
让Apache重新加载我的代码时,我的Apache日志中出现了一个ImportError。通常这意味着我尝试导入的模块不在PYTHONPATH中,因此我在wsgi.py
中放置了print sys.path
语句。情况就是这样:
[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
但是我的Django应用程序不知何故找不到Django_漂白模块,即使它在正确的位置
附加信息:Mywsgi.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()
相对于运行apache的用户。哪个用户正在运行apache?通常apache以默认用户“nobody”或“apache”运行。拥有到“~”的相对路径将指向运行apache的用户的主目录
我建议使用virtualenv或指定本地pip包的绝对路径。进入站点包目录并运行pwd
将让您知道绝对路径。如果运行apache的用户无法读取/写入/执行pip包和目录,那么您可能还需要更改它们的权限
当您进入Python REPL时,它可以正常工作,因为您以用户身份执行所有操作,“~”指向您的主目录
WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
如果您有权编辑服务器上的apache配置文件,我建议您查看一下Django文档,
事件如果您不使用virtualenv,您仍然需要相应地将其设置为本地站点包目录的绝对路径
WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
我终于解决了我的问题。事实证明,尽管WSGI搜索的PYTHONPATH上有
/users/ejt64/.local/lib/python2.7/site packages/
,但我忘记了使该路径上的一个目录可执行,因此Apache用户无法访问它
尽管所有目录和文件都是世界可读的,但用户不能读取世界可读的文件,除非它对包含它的所有目录都具有执行权限,而且我的主目录(/users/ejt64
)是世界可读的,但不是世界可执行的。一旦我使这个目录世界成为可执行的,ImportError就消失了
如果我能让Apache/WSGI/Python在尝试读取PYTHONPATH上的目录时打印一条错误消息,但由于权限原因无法访问该目录,那就太好了。您不使用
--user
安装它的原因是什么?我不确定您的评论是什么意思。我必须使用--user
安装django bleach,因为我在此服务器上没有root/sudo权限。您的wsgi
文件是什么样子的?您可以在那里映射Python版本。Mywsgi.py
是由Django的startproject
命令生成的。为了以防万一,我将把它包括在我的问题中,但我不知道你所说的“映射python版本”是什么意思。你完全正确,但我在我的问题中误导了你。Apache打印出来的PYTHONPATH实际上包含到用户主目录的绝对路径,而不是~
路径。我认为在示例中包含我的用户名会让事情变得混乱。
WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages