【发布时间】: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