4

我想用 Apache mod-wsgi 部署的 django webapp 有一些问题,我已经将它们追溯到这一行(缺少 django-tagging 模块):

[2013 年 2 月 20 日星期三 13:08:42] [错误] [客户端 172.19.130.50] ImportError: No module named tagging

现在,这是我尝试以 root 和 apache 用户身份运行 pip-python(我使用的是 CENTOS 6)时的输出:

[root@app1 site-packages]# pip-python freeze | grep 标签
django 标记==0.3.1
django-taggit==0.9.3

标记已安装...

[root@app1 站点包]# sudo -u apache pip-python freeze | grep 标签
django 标记==0.3.1
django-taggit==0.9.3

Apache用户也这么说!

[root@app1 /]#python
Python 2.6.6(r266:84292,2012 年 9 月 11 日,08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] 在 linux2 上
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 导入标记
>>>

好的root可以导入标签!

[root@app1 /]# sudo -u apache python
Python 2.6.6(r266:84292,2012 年 9 月 11 日,08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] 在 linux2 上
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 导入标记
回溯(最近一次通话最后):
  文件“”,第 1 行,在
ImportError:没有名为标记的模块
>>>

但是apache用户不能!!!!!!我怎样才能使这项工作????

我已经双重和三重检查了 /usr/lib/python2.6/site-packages/ 的所有权限以进行 django-tagging,它们与我的其他包相同。

更新 1: 我真的不记得我是如何安装 django-tagging 模块的 - 但可能是 root 用户,因为 apache 无法全局安装模块!

更新 2: 这是 martijn-pieters 的建议的输出:

[root@app1 /]# sudo -u apache python -c 'import sys; 打印 sys.path'
['', '/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg', '/usr/lib/python2.6/site-packages/django_cas -2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', ' /usr/lib64/python2.6/lib-tk'、'/usr/lib64/python2.6/lib-old'、'/usr/lib64/python2.6/lib-dynload'、'/usr/lib64/ python2.6/site-packages','/usr/lib/python2.6/site-packages','/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info ']
[root@app1 /]# python -c 'import sys; 打印 sys.path'
['', '/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg', '/usr/lib/python2.6/site-packages/django_cas -2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', ' /usr/lib64/python2.6/lib-tk'、'/usr/lib64/python2.6/lib-old'、'/usr/lib64/python2.6/lib-dynload'、'/usr/lib64/ python2.6/site-packages','/usr/lib/python2.6/site-packages','/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info ']
[root@app1 /]# sudo -u apache head `which pip-python`
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip'
__requires__ = 'pip==0.8'
导入系统
从 pkg_resources 导入 load_entry_point

如果 __name__ == '__main__':
    系统退出(
        load_entry_point('pip==0.8', 'console_scripts', 'pip')()
    )
[root@app1 /]# head `which pip-python`
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip'
__requires__ = 'pip==0.8'
导入系统
从 pkg_resources 导入 load_entry_point

如果 __name__ == '__main__':
    系统退出(
        load_entry_point('pip==0.8', 'console_scripts', 'pip')()
    )

完全一样:(

更新 3: 是的,apache 用户可以加载其他模块:

[root@app1 /]# sudo -u apache python
Python 2.6.6(r266:84292,2012 年 9 月 11 日,08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] 在 linux2 上
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 导入 django
>>> 进口扭曲
>>> 进口开罗

更新4:我讨厌自己。问题是 /usr/lib/python2.6/site-packages/tagging/ 目录的访问权限!它们是 drw-r--r-- (644) 而不是正确的 drwxr-xr-x(755),因此 apache 用户无法进入目录:(

现在一切正常,感谢所有帮助!

4

1 回答 1

2

我经历过与这种行为类似的事情,最终将要导入的模块的确切路径添加到 Django wsgi.py 文件中:

import sys
PACKAGES ='/usr/local/lib/python2.6/dist-packages/'
sys.path.append(PACKAGES + 'django_compressor-1.1.1-py2.6.egg')

希望能帮助到你。

谁该受责备?不确定,也许是 apache 或 mod_wsgi。这在 Ubuntu 10.04 的 apache2 中发生在我身上。Debian stable 和 testing 中的 apache2 中的最新设置不再需要 sys.path.append。

于 2013-03-15T11:25:30.797 回答