Django Apache ValueError:在非包中尝试相对导入

时间:2014-09-19 18:42:27

标签: python django apache virtualenv

我已经看过ValueError: relative import in non-packge的一些讨论,但是关于调用脚本的讨论似乎与我目前遇到的问题无关(或者如果他们这样做,我不太了解)足够他们如何 ......)。

昨天,我建立了一个运行Apache的新Ubuntu Server VM。我有一个Python3.4 virtualenv,Apache在运行我的Django应用程序时用于它的解释器和包目录。

我的目录结构如下所示:

目录结构

Django_proj/
    manage.py
    ...

    Django_proj/
      __init__.py
       wsgi.py
       urls.py

       settings/
           __init__.py
           core_settings.py
           prod_settings.py
           local_settings.py
           logging_settings.py

目前,我正在加载local_settings.py,我有以下相对导入:

from .logging_settings import LOGGING

但是我在Apache日志中得到了一个类似于以下内容的Traceback:

File "/PATH/TO/VIRTUALENV/lib/python3.4/site-packages/django/utils/importlib.py", line 40, in import_module
      __import__(name)
File "/PATH/TO/Django_proj/Django_proj/local_settings.py", line 12, in <module>
     from .logging_settings import LOGGING
ValueError: Attempted relative import in non-package

Shell Works

如果我转到顶级目录并运行(激活virtualenv之后)python manage.py shell,则不会出现此错误:它能够成功导入local_settings.py以及我的任何django应用程序和我可以访问变量(例如LOGGING中的django.conf.settings)。


wsgi.py

这是wsgi.py文件,在那里我有点疯了,将所有列出的目录添加到路径中:

import os
import sys
sys.path.append('PATH/TO/Django_proj')
sys.path.append('PATH/TO/Django_proj/Django_proj')
sys.path.append('PATH/TO/Django_proj/Django_proj/settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
                      "settings.local_settings")

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

Apache配置

Apache正在成功导入Django并使用正确的Python解释器(可以在Traceback中看到),但我认为Apache可能会运行应用程序有些奇怪,所以除了wsgi.py中的路径,我将我能想到的所有内容添加到WSGIDaemonProcess path。这是我的 httpd.conf

LoadModule wsgi_module  modules/mod_wsgi.so

ServerName localhost
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIDaemonProcess django-proj.org processes=2 threads=12 python-path=/virtualenv/PATH/lib/python3.4/site-packages:/virtualenv/PATH/bin:/PATH/TO/Django_proj:/PATH/TO/Django_proj/Django_proj:/PATH/TO/Django_proj/Django_proj/settings
WSGIProcessGroup django-proj.org

但是我不太了解当Apache为了运行wsgi.py而旋转Python时所发生的情况。我想如果我只是在任何地方添加了所有相关路径,那么问题应该消失,Python应该能够从logging_settings.py本地查找并导入local_settings.py。但是,local_settings.py似乎是非包裹。

无论如何,我很困惑,为什么我收到这个错误,我很感激知道Stack Overflowers的输入。

修改:我应该提一下,我已多次阅读以下文档,这很有用:https://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

1 个答案:

答案 0 :(得分:1)

嗯,这很令人尴尬,但我真的不知道我做了什么来解决这个问题。但是,它是固定的。这就是我的所作所为。

我的源安装Python shell没有使用readline(没有历史记录),我遇到了一个无关的问题,我按照此处的描述进行了修复:https://stackoverflow.com/a/25942732/1748754

我需要在构建readline之后重新编译Python,并且因为这一切都在VM上(使用Vagrant和Ansible设置),我只是将其销毁并重建它。

之后,我注意到在我的wsgi.py中,我以奇怪的方式导入设置,所以我只是按照以下方式附加了主项目路径和导入的设置:

<强> wsgi.py

import os
import sys
sys.path.append('/PATH/TO/Django_proj/Django_proj/')
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
                      "Django_proj.settings.local_settings")

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

我做了这个更改是因为我意识到wgsi.pymanage.py以不同方式导入settings.py,因此我将wsgi.py更改为manage.py

很难相信readline缺失会导致我出现其他错误,如果是这样,这可能是非常具体的,对任何其他人都没用。

问题是,只有在我完成所有其他工作后才检查它是否有效。

无论如何,有点尴尬的是不知道是什么解决了问题,它涉及完整的os-teardown-and-rebuild(使用Vagrant / Ansible非常容易),但确实如此。