8

最近、Djangoプロジェクトの1つにあるすべてのビューを、新しいクラスベースのビューに移行しました。従来の関数ベースのDjangoビューのdjango.views.decorators.http.condition場合、指定した条件に一致するキャッシュされたコピーがある場合に、ビュー処理全体をバイパスするために使用できる便利なデコレーターがあります。ドキュメントとソースコードのいたるところを検索しましたが、新しいクラスベースのビューの実装は見つかりませんでした。

だから私の質問は:クラスベースのビューに条件付きビュー処理を実装することをどのように提案しますか?

4

3 に答える 3

5

この問題に対する良い答えはまだないようです。関数属性(たとえばcsrf_exempt)を設定するだけのデコレータの場合、それらをビュークラスのメソッドに適用するだけで十分ですが、最初の関数の引数がではなくリクエストオブジェクトであると想定してdispatchいるため、デコレータでは明らかに機能しません。conditionself

これを実現する2つの方法は次のとおりです。

  1. 生成されたビュー関数にデコレータを適用します。一般的なビュー機能は、実際にはクラスからビュー関数を構築する方法に要約されるため、デコレータを遅く適用することはオプションかもしれません。このようなもの:

    f = ViewClass.as_view()
    f = condition(...)(f)
    

    conditionこれには、デコレータに渡す関数からビュークラスにアクセスできないという欠点があります。as_viewまた、urlconfでメソッドを呼び出す場合も、あまり便利ではありません。

  2. dispatchビューのメソッド内にデコレータを適用できる単純な関数に委任します。このようなもの:

    def dispatch(self, request, *args, **kwargs):
        @condition(...)
        def _dispatch(request, *args, **kwargs):
            return super(ViewClass, self).dispatch(request, *args, **kwargs)
        return _dispatch(request, *args, **kwargs)
    

    これには、デコレータを適用するときにビュークラスインスタンスにアクセスできるという利点があるため、キャッシュ検証関数にインスタンスメソッドを使用できます。欠点は、ビューが呼び出されるたびにデコレータが実行されることですが、この特定のデコレータでは問題のようには見えません。

ただし、どちらのソリューションにも問題があるため、バグレポートを提出するか、django-usersメーリングリストでこれら2つの概念をどのように組み合わせるのが最適かを尋ねる価値があります。

于 2012-10-21T01:21:50.437 に答える
2

以下を使用できます。

def conditional(**kwargs):
    '''A wrapper around :func:`django.views.decorators.http.condition` that
    works for methods (i.e. class-based views).

    '''
    from django.views.decorators.http import condition
    from django.utils.decorators import method_decorator
    return method_decorator(condition(**kwargs))
于 2013-07-16T21:22:17.290 に答える
1

キャッシングは複雑な問題ですが、最近の傾向(サーバーでのデータ/フラグメントキャッシングとブラウザーでのアセットキャッシングの両方)は、キャッシュ無効化の問題の解決に時間を費やさない方がよいことを示しています。この記事で説明されている:

http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works

Djangoに適用されたこの手法の実際の例:

http://www.rossp.org/blog/2012/feb/29/fragment-caching/

于 2012-10-21T00:59:37.700 に答える