2014-09-19 59 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來說非常簡單),但它確實存在。