1

[編集] 私のコードはうまくいくようですが、別のコード+疲れが問題です。 [/ edit]Djangoクラスベースのビュー - 予期せぬデコレータの振る舞い

私はいくつかの要求キーを簡単にチェックするデコレータを持っています。

def fields_required(*fields): 
assert isinstance(fields, tuple), "Fields must be of type tuple." 

def wrap_func(fn): 

    def wrapper(cls, request, *args, **kwargs): 
     print 'oh hi' 
     missing_fields = [] 
     for field in fields: 
      if not request.REQUEST.has_key(field): 
       missing_fields.append(field) 

     if len(missing_fields) > 0: 
      #maybe do smth here 
      return HttpResponseBadRequest()   

     return fn(cls, request, *args, **kwargs) 
    return wrapper 
return wrap_func 

フィールドの1つが不足していてもデコレータが決してそのコードを実行しないと、HTTP 403 Bad Requestステータスコードが予想されます。

私のビューファイルの基本的な表現:

class ViewA(View): 

    @fields_required('name','api_key') 
    def get(self, request, *args, **kwargs): 
     # some logic 

class ViewB(View): 

    @fields_required('SHOULD_NEVER_SEE','THIS_STUFF') 
    def get(self, request, *args, **kwargs): 
     # some logic 

ブラウザでViewAを開くと、コンソール出力は以下の通りである:

('name', 'api_key') 
('SHOULD_NEVER_SEE','THIS_STUFF') 

ViewBためのデコレータが実行された理由を私は理解できません、なぜ私のコンソールに 'oh hi'がないのでしょうか?どんな洞察?

答えて

1

ViewBのデコレータは「実行」されていますが、ViewAを表示しているため表示されません。 Pythonはファイル自体を実行するときにメソッドをデコレートするからです。たとえば、次のプリントfuncが呼び出されていない場合でもb:「ああ、こんにちは」が印刷されていないことを問題について

def deco(f): 
    print 'b' 
    def g(): 
     print 'c' 
    return g 

@deco 
def func(): 
    print 'a' 

。複数のデコレータの呼び出しで明確にするため

@method_decorator(fields_required('SHOULD_NEVER_SEE','THIS_STUFF')) 
def dispatch(self, *args, **kwargs): 
    pass 
+0

感謝を:あなたは(つまり、あなたの意見に以下を追加します)dispatch代わりのgetにデコレータを追加してみてください。私が探していたものではない - まず第一にそれはうまくいかない;)、第二に、そのクラスの投稿/取得に異なる制限を設定したい。 –

+0

あなたの編集に基づいて問題を修正したそして十分に公正で、派遣と派遣と派遣の区別は本当に重要です。 –