【问题标题】:Django on Apache with mod_wsgi: ImportError on settings带有 mod_wsgi 的 Apache 上的 Django:设置上的 ImportError
【发布时间】:2015-11-07 04:26:40
【问题描述】:

我正在使用 mod_wsgi 为 Apache2 服务器上的 Django 站点提供服务。这是我的 mysite/mysite 目录的样子:

(mysite_venv)➜  mysite  tree mysite -I "*.pyc"
    mysite
    ├── __init__.py
    ├── db.sqlite3
    ├── settings
    │   ├── __init__.py
    │   ├── base.py
    │   └── local.py
    ├── urls.py
    └── wsgi.py

当我使用 python manage.py runmodwsgi 运行此项目时,我在日志中收到一条内部服务器错误消息:

[wsgi:error] [pid 8900] ImportError:         No module named mysite.settings.local
[mpm_prefork:notice] [pid 8898] AH00170: caught SIGWINCH, shutting down gracefully

这是我的 manage.py 的样子:

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

但是当我像这样更改目录 mysite/mysite 时:

(mysite_venv)➜  mysite  tree mysite -I "*.pyc"
mysite
├── __init__.py
├── base.py
├── db.sqlite3
├── local.py
├── urls.py
└── wsgi.py

并将代码 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local") 更改为 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.local") 服务器运行正常! 我该如何解决这个问题?

PS:当我使用python manage.py runserver 运行这个项目时,一切正常。

这是我的 sys.path 的样子:

/Users/gagaxiaolong/PycharmProjects/mysite
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python27.zip
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/plat-darwin
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/plat-mac
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/plat-mac/lib-scriptpackages
/Users/gagaxiaolong/.virtualenvs/mysite_venv/Extras/lib/python
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/lib-tk
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/lib-old
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/lib-dynload
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/site-packages
/Users/gagaxiaolong/.virtualenvs/mysite_venv/lib/python2.7/site-packages/IPython/extensions

9个月前有一个类似的问题:How to debug basic issues configuring django to be served with apache and mod-wsgi?,我尝试了答案中提到的方法但不起作用。

【问题讨论】:

标签: python django apache settings mod-wsgi


【解决方案1】:

您需要在 manage.py 文件中检查 sys.path(为此使用 pdb)。我认为这是因为你有一个像这样的目录结构'parent_dir/mysite/mysite/settings/'并且你的 sys.path 有一个条目'parent_dir'。所以系统试图在parent_dir/mysite 中找到settings 模块。将你的 manage.py 更改为调试

import os
import sys

if __name__ == "__main__":
    import ipdb; ipdb.set_trace()
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

【讨论】:

  • 在使用 Apache/mod_wsgi 时建议 pdb 或类似的东西不一定是个好主意,因为设置起来并不简单。这是因为进程被妖魔化了,并且没有附加终端,所以你不能通过终端轻松地与它进行交互。
  • 使用不在 apache 上的 runserver 进行调试(在远程服务器上)。如果您在 apache 上运行时对路径感兴趣,请添加日志。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2014-05-11
  • 2016-02-05
  • 2018-05-31
  • 2014-03-02
  • 1970-01-01
  • 2011-05-26
  • 2013-08-06
相关资源
最近更新 更多