2014-09-19 56 views
1

我看到了关于ValueError: relative import in non-packge的大量讨论,但关于调用脚本的讨论似乎与我目前遇到的问题有关(或者如果他们这么做,我不够好懂得他们如何 ......)。Django Apache ValueError:试图在非包中导入相对导入

昨天,我建立了一个运行Apache的新Ubuntu服务器虚拟机。我有一个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日志,看起来像下面这样:

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应用程序,我可以访问变量(如LOGGINGdjango.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 Config

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 

但我不明白,也有足够的了解,当阿帕奇才能运行wsgi.py旋转起来的Python正在发生的条件。我想如果我只是在所有地方添加所有相关路径,那么问题应该消失,Python应该能够从local_settings.py本地查找并导入logging_settings.py。但是,看起来local_settings.py是非包装。

无论如何,我很困惑,为什么我收到这个错误,我希望知道堆栈溢出的输入。

编辑:我要指出,我已阅读下列文件多次为好,它是有用的:https://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

回答

1

好了,这是令人尴尬的,但我真的不知道我确实解决了这个问题。但是,它是固定的。这就是我所做的。

我没有使用的ReadLine(不起来的历史),如下所述,我固定和我装的从源代码的Python壳无关的问题:https://stackoverflow.com/a/25942732/1748754

我需要建设,readline之后重新编译的Python,并且因为这些都在虚拟机上(与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来说非常简单),但它确实存在。