1

mod_wsgiとvirtualenvを使用してDjango1.4プロジェクトをデプロイしようとすると、500が実行されます。Apacheerror_logは次のことを明らかにします。

mod_wsgi (pid=30452): Exception occurred processing WSGI script '/path/to/project/site-packages/projectapp/wsgi.py'.
[...] Traceback (most recent call last):
[...]   File "/path/to/project/env/myenv/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
[...]     self.load_middleware()
[...]   File "/path/to/project/env/myenv/lib/python2.6/site-packages/django/core/handlers/base.py", line 47, in load_middleware
[...]     raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
[...] ImproperlyConfigured: Error importing middleware projectapp.content.middleware: "cannot import name SomeModel"

エラーメッセージから、これはある種のパスの問題であると思います。ただし、問題のあるミドルウェアがDjango設定から削除されると、サイトは正常に起動し、からロードされた他のモジュールprojectapp.contentSomeModelこの場合にロードされます。そうしないと、サイト全体を実行できなくなります。

発生したインポートエラーは、モデルをインポートしないため、ミドルウェアから直接発生するものではありません。SomeModelvirtualenvのsrcディレクトリに実際にチェックアウトされる別のアプリで定義されます。ただし、このアプリを含むディレクトリもパスに含まれています。

私が使用しているwsgi.pyファイル:

import os
import sys

sys.stdout = sys.stderr

sys.path.insert(0, '/path/to/project/env/myenv/lib/python2.6/site-packages/')
# The module inside the following directory
# defines SomeModel from the error message
sys.path.insert(0, '/path/to/project/env/myenv/src/some-app/')
sys.path.insert(0, '/path/to/project/site-packages/')

import django.core.handlers.wsgi

os.environ['DJANGO_SETTINGS_MODULE'] = 'projectapp.settings'
application = django.core.handlers.wsgi.WSGIHandler()

モジュールパスを挿入した後に印刷sys.pathすると、すべてが予想される順序で表示され、/path/to/project/site-packages/最初にリストされ、次に/path/to/project/env/myenv/src/some-app/(を定義するSomeModel)リストされます。

mod_wsgiドキュメントの例に基づいて、別のバリアントも試しました。

import os
import sys
import site

ALLDIRS = [
    '/path/to/project/site-packages/',
    '/path/to/project/env/myenv/lib/python2.6/site-packages/',
    '/path/to/project/env/myenv/src/some-app/',
]

# Remember original sys.path
prev_sys_path = list(sys.path)

sys.stdout = sys.stderr

# Add each new site-packages directory
for directory in ALLDIRS:
    site.addsitedir(directory)

# Reorder sys.path so new directories are at the front
new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

#activate_this = '/path/to/project/env/myenv/bin/activate_this.py'
#execfile(activate_this, dict(__file__=activate_this))

import django.core.handlers.wsgi

os.environ['DJANGO_SETTINGS_MODULE'] = 'projectapp.settings'
application = django.core.handlers.wsgi.WSGIHandler()

Apacheによってログに記録されるエラーはまったく同じです。

同じマシンで開発サーバーを実行している場合、ミドルウェアが正常にロードされることを追加する必要があるため、何が問題になっているのかわかりません。mod_wsgiからより良いトレースバックを取得する方法はありますか?

編集:

デーモンモードでmod_wsgiを使用していることを忘れてしまいました。これが私の仮想ホスト設定からの関連部分です:

<VirtualHost x.x.x.x:80>
    WSGIDaemonProcess foo user=foo threads=10 umask=0002
    WSGIProcessGroup foo
    WSGIScriptAlias / /path/to/project/site-packages/projectapp/wsgi.py
</VirtualHost>
4

1 に答える 1

0

何時間ものデバッグの後、これはミドルウェアによって引き起こされた競合状態であることが判明しました。私が使用しているミドルウェアはFlatpageFallbackMiddleware、Djangoの寄稿者と同様であり、実際にはビューのインポートが問題を引き起こしました。

from projectapp.content.views import generic_content_detail
class ContentFallbackMiddleware(object):
    def process_response(self, request, response):
        [...]

メソッド内でimportステートメントを移動するとprocess_response、問題が解決しました。

class ContentFallbackMiddleware(object):
    def process_response(self, request, response):
        from projectapp.content.views import generic_content_detail
        [...]
于 2012-09-14T14:31:35.877 に答える