1

[編集] したがって、私のコードは正常に動作しているようです。別のコード + 疲労が問題です [/編集]。

いくつかの必要なリクエスト キーを簡単にチェックするデコレータがあります。

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 のデコレータが実行される理由と、コンソールに「こんにちは」が表示されない理由がわかりません。洞察はありますか?

4

1 に答える 1

1

The decorator for ViewB is "executed" but not because you're viewing ViewA. It's because Python decorates the method when it executes the file itself. For example, the following prints b even though func is not called:

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

@deco
def func():
    print 'a'

Regarding the issue that 'oh hi' is not printed; could you try adding the decorator to dispatch instead of get (i.e., add the following to your views):

@method_decorator(fields_required('SHOULD_NEVER_SEE','THIS_STUFF'))
def dispatch(self, *args, **kwargs):
    pass
于 2012-04-04T14:40:37.830 に答える