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'がないのでしょうか?どんな洞察?
感謝を:あなたは(つまり、あなたの意見に以下を追加します)
dispatch
代わりのget
にデコレータを追加してみてください。私が探していたものではない - まず第一にそれはうまくいかない;)、第二に、そのクラスの投稿/取得に異なる制限を設定したい。 –あなたの編集に基づいて問題を修正したそして十分に公正で、派遣と派遣と派遣の区別は本当に重要です。 –