如何调试使用apache和mod-wsgi配置django的基本问题?

Gre*_*ade 6 python apache django mod-wsgi

人们通过apache和mod-wsgi设置django是很常见的.常见的症状是"导入错误"...由于某种原因(在每种情况下通常略有不同)settings.py或类似的不导入(有关大量示例,请参阅本页右栏中的"相关"!).

我已经阅读了关于这个主题的其他问题,似乎没有一个解决方案适用于我的情况(一个是由回答者发现的海报的基本错误配置 - 我似乎没有这个问题,其他人适用于使用来自其他模块的wsgi等).

当apache/mod-wsgi无法加载时,你如何调试它?

你能做些什么来为你提供比"导入错误"更好的信息?

显然,我正在寻找一种方法来识别我的错误.但我真的想知道如何调试这种类型的失败:我似乎无法找到有关它导致失败的信息.


在我的情况下,我试图用mod-wsgi做一个看似简单的django部署 - 实际上是本书,与doc相同,但得到错误:

ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings
Run Code Online (Sandbox Code Playgroud)

我看不出为什么找不到这个模块.

/home/cmc/src/cm_central/cm_central/settings.py存在,可以由pythonn加载而不会出错,实际上可以正常工作./manage.py runserver.

是否有可能在apache的上下文中发生一些导入错误,当我自己加载时不会发生这种情况?我想知道因为"设置文件中是否有导入错误?" ......为什么要问这个?如果有导入错误,我该如何调试它?

我在/ etc/apache2/sites-enabled/cm-central中有这个:

<VirtualHost *:80>

  WSGIScriptAlias / /home/cmc/src/cm_central/cm_central/wsgi.py
  WSGIDaemonProcess cm-central.johalla.de python-path=/home/cmc/src/cm_central:/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages
  WSGIProcessGroup cm-central.johalla.de

  <Directory /home/cmc/src/cm_central/cm_central>
    <Files wsgi.py>
      Order deny,allow
      Allow from all
    </Files>
  </Directory>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这在wsgi.py中:(我还没有从django生成的内容中修改它)

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cm_central.settings")

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())
Run Code Online (Sandbox Code Playgroud)

完整的追溯是:

[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Target WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py' cannot be loaded as Python module.
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Exception occurred processing WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py'.
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] Traceback (most recent call last):
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/src/cm_central/cm_central/wsgi.py", line 16, in <module>
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     application = Cling(get_wsgi_application())
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     django.setup()
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/__init__.py", line 20, in setup
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in __getattr__
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     self._setup(name)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     self._wrapped = Settings(settings_module)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]   File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 98, in __init__
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40]     % (self.SETTINGS_MODULE, e)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings
[Sun Nov 09 12:04:06 2014] [notice] Graceful restart requested, doing restart
[Sun Nov 09 12:04:06 2014] [notice] Apache/2.2.22 (Debian) PHP/5.4.4-14+deb7u14 mod_wsgi/3.3 Python/2.7.3 configured -- resuming normal operations
[Sun Nov 09 21:34:15 2014] [error] Not Found: /
Run Code Online (Sandbox Code Playgroud)

如果一个答案可以帮助我发现什么是错的,那就太好了 - 但更好的是"如何调试这个"的答案.如何找出为什么 settings.py不会加载?

Gre*_*ade 1

最后,回答一个高级问题:如何调试?

而且它是如此明显:

从 settings.py 中打印出所有重要的内容,然后查看 apache 日志以查看您获得的内容,然后将其与您在开发中获得的内容进行比较!

链接的文章建议在 settings.py 中使用这组打印:

导入系统、操作系统

print "__name__ =", __name__
print "__file__ =", __file__
print "os.getpid() =", os.getpid()
print "os.getcwd() =", os.getcwd()
print "os.curdir =", os.curdir
print "sys.path =", repr(sys.path)
print "sys.modules.keys() =", repr(sys.modules.keys())
print "sys.modules.has_key('mysite') =", sys.modules.has_key('mysite')
if sys.modules.has_key('mysite'):
  print "sys.modules['mysite'].__name__ =", sys.modules['mysite'].__name__
  print "sys.modules['mysite'].__file__ =", sys.modules['mysite'].__file__
  print "os.environ['DJANGO_SETTINGS_MODULE'] =", os.environ.get('DJANGO_SETTINGS_MODULE', None)
Run Code Online (Sandbox Code Playgroud)

出于我的目的,我还添加了 DATABASE_URL,后来添加了 EMAIL_HOST_USER 等

文章还很好地解释了整个启动过程是如何发生的,这是值得的。

请注意,它与 django 本身有点过时,因此他提出的最终“替代 wsgi.py”可能不太适用,但调试技术肯定是适用的。