【问题标题】:Django can't import class in subdir of app when deployed with apache&mod_wsgi使用 apache&mod_wsgi 部署时,Django 无法在应用程序的子目录中导入类
【发布时间】:2015-11-11 04:00:54
【问题描述】:

我在 centos6.5 和 python 2.6.6 中使用 Django (1.5.12) 和 httpd-2.2.15-29。

真是奇怪的错误,我被卡住了。请帮帮我!

我的项目树如下所示:

/opt/django-demo
|-- api
|   |-- __init__.py
|   |-- **views.py**
|   |-- utils
|   |   |-- __init__.py
|   |   |-- **debug.py**
|-- demo
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   |-- wsgi.py

我需要在views.py中导入utils.debug

from api.utils import debug

它适用于 django runserver,但不适用于 apache:

Request Method: GET
Request URL:    http://xxxxx/xxxx/
Django Version: 1.5.12
Exception Type: ImportError
Exception Value: No module named utils
Exception Location: /opt/django-demo/api/debug.py in <module>, line 9
Python Executable:  /usr/bin/python
Python Version: 2.6.6
Python Path:    
['/opt/django-demo',
 '/usr/lib/python2.6/site-packages/pip-7.1.2-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/lib64/python2.6/site-packages/gst-0.10',
 '/usr/lib64/python2.6/site-packages/gtk-2.0',
 '/usr/lib64/python2.6/site-packages/webkit-1.0',
 '/usr/lib/python2.6/site-packages',
 '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info',
 '/opt/django-demo/api/utils']

从你可以看到的错误中,子目录已经被 wsgi.py 添加到 PYTHONPATH 中。 也没有错过__init__.py

在我 mv utils/debug.py 到 api/debug.py 之后:

from api import debug

有效!!!

那么,为什么?

【问题讨论】:

  • 由于/opt/django-demo/api/utils 在python 路径中,您可以:import debug
  • @KlausD。是的,这行得通!但为什么?我需要添加几个子目录,我需要将它们全部添加到 PYTHONPATH 中吗? '/opt/django-demo' 已经在 PYTHONPATH 中,为什么 from api.utils import debug 不工作?
  • 基本上你会在输出中看到 PYTHONPATH。您可以导入任何此路径中存在的东西。在您的情况下,您在 PYTHONPATH 中有 /opt/django-demo/api/utils,因此导入只会在那里找到 debug.py。您还应该能够导入与第一个路径匹配的from api.utils import debug。对于开发来说最重要的是两件事:a) 没有名称冲突,如果有两个具有相同名称的包/模块,事情会变得很糟糕;b) 确保 PYTHONPATH 设置在您以不同方式运行代码时没有区别。

标签: python django apache mod-wsgi


【解决方案1】:

终于解决了问题。 貌似debug.py有bug,需要导入。 修复错误后,此错误消失。

甚至 '/opt/django-demo/api/utils' 也不需要添加到 PYTHONPATH 中。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多