0

簡単な質問です。私はたくさんのジャンゴビューを持っています。foo(view)ビューごとに代わりに使用することをdjangoに伝える方法はありますか? 例:

書く代わりに

@foo
@bar
@baz
def view(request):
    # do something

ずっと、持っていたい

def view(request):
    markers = ['some', 'markers']

これをdjangoにフックします:

for view in all_the_views_in_my_app:
    view = do_something_based_on_the_marker(view)

サーバーの起動時にこれを実行したいと思います。何かご意見は?

4

2 に答える 2

2

やりたいこと (または達成したいこと) に応じて、カスタム ミドルウェアを作成し、メソッドprocess_view(および/または必要なその他のメソッド) を実装できます。

process_view()Django がビューを呼び出す直前に呼び出されます。NoneまたはHttpResponseオブジェクトを返す必要があります。が返された場合None、Django はこのリクエストの処理を続行し、他のprocess_view()ミドルウェアを実行してから、適切なビューを実行します。オブジェクトが返されたHttpResponse場合、Django は他のリクエスト、ビュー、例外ミドルウェア、または適切なビューをわざわざ呼び出すことはありません。を返しますHttpResponse。応答ミドルウェアは、すべての応答で常に呼び出されます。

于 2010-01-21T19:26:53.843 に答える
1

なぜあなたがこれをしたいのか分かりません。デコレータを使いたくない理由もわかりません。しかし、この醜い(そしておそらくエラーが発生しやすい)ハックを出発点として使用することができます:

def view(request):
    pass
view.markers = ['some', 'markers']

他の場所:

from app import views
[x for x in views.__dict__.values() if hasattr(x,'markers')]
于 2010-01-21T16:42:12.173 に答える