2

私は独自のコンテキスト プロセッサを実装しており、django の設定で適切に構成しようとしています。

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_PROCESSORS
MY_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'com.mysite.apps.myapp.processors.MyProcessor.MyProcessor.process',
)
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_PROCESSORS + MY_CONTEXT_PROCESSORS

しかし、次のエラーが発生しました:

リクエスト プロセッサ モジュール com.mysite.apps.myapp.processors.MyProcessor.MyProcessor のインポート中にエラーが発生しました:「MyProcessor という名前のモジュールはありません」

MyProcessorは、静的メソッド " " を持つ単純なクラスですprocess(私は OOP が大好きで、プロジェクトでクラスとパッケージ アーキテクチャを使用しています)。終了し、正しく綴られています...では、何が問題なのですか?

アップデート:

process私のクラスを単純な " " 関数 (" ") に置き換えるcom.mysite.apps.myapp.processors.MyProcessor.processことで動作します... しかし、私は満足していません... Django はこれらのプロセッサをどのようにロードしますか? アプリ (モデル、テスト、ビューなど) のあらゆる場所でパッケージ/クラスのアプローチを使用していますが、通常は機能します...ここでの違いは何ですか? Python の動的な性質により、「com.mysite.apps.myapp.processors.MyProcessor.MyProcessor」のようなパスは、クラスまたは標準の「サブモジュール」とは別に解決する必要があります...同意しませんか?

4

2 に答える 2

2

.Django は、 がサブパッケージを意味するのか、そのパッケージ内の変数を意味するのかを知りません。したがって、 、、はすべてパッケージであり、それ(つまり、最後の値) はそのモジュールの属性であるfoo.bar.baz.quuxと想定されます。foobarbazquux

TEMPLATE_CONTEXT_PROCESSORS最終的に、その値はdjango.template.context.get_standard_processors( source code ) によってインポートされます。

これは、その関数の関連するコードです。

i = path.rfind('.')
module, attr = path[:i], path[i+1:]

したがって、モジュール内でネストされた値にアクセスすることはできません。これは、私が見ることができるどこにも明確に文書化されていません。本当に静的メソッドにアクセスしたい場合、私が見ることができる唯一のオプションは次のとおりです。

class MyProcessor(object):

    @staticmethod
    def process(request):
        # whatever ...


process = MyProcessor.process

そしてあなたに追加しますTEMPLATE_CONTEXT_PROCESSORS "com.mysite.apps.myapp.processors.MyProcessor.process"

于 2013-06-21T12:04:56.860 に答える
0

というファイルがありますMyProcessor.pyか? Python は次のことを期待しているようです。

com/mysite/processors/MyProcessor.py
于 2013-06-21T10:04:32.520 に答える