【问题标题】:Django Apache ValueError: Attempted Relative Import in non-packageDjango Apache ValueError:尝试在非包中进行相对导入
【发布时间】:2014-11-14 10:26:14
【问题描述】:

我在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

壳牌工程

如果我转到顶级目录并运行(激活 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 运行应用程序的方式可能有些奇怪,所以除了 @987654332 中的路径@,我将我能想到的所有内容都添加到了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 启动 Python 以运行 wsgi.py 时所发生的情况了解不够。我想如果我只是在所有地方添加了所有相关路径,那么问题应该会消失,Python 应该能够从 local_settings.py 在本地找到并导入 logging_settings.py。但是,local_settings.py 似乎是一个非包。

无论如何,我很困惑为什么我会收到此错误,我希望了解 Stack Overflowers 的意见。

编辑:我应该提一下,我也多次阅读以下文档,它很有用:https://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

【问题讨论】:

    标签: python django apache virtualenv


    【解决方案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 来说很容易),但它确实存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-08
      • 2020-07-20
      • 1970-01-01
      • 2019-10-16
      • 2014-02-28
      • 2016-09-08
      • 2019-05-25
      • 2014-01-02
      相关资源
      最近更新 更多