【问题标题】:Django Class Based View - unexpected decorator behaviourDjango 基于类的视图 - 意外的装饰器行为
【发布时间】:2012-04-04 14:21:27
【问题描述】:

[编辑] 所以看来我的代码工作正常,另一段代码+疲倦是问题 [/编辑]。

我有一个装饰器,它可以简单地检查几个所需的请求键。

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

如果其中一个字段丢失,我预计 HTTP 403 错误请求状态代码,但装饰器从不执行该代码。

我的视图文件的基本表示:

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”。有什么见解吗?

【问题讨论】:

    标签: python django django-views decorator django-class-based-views


    【解决方案1】:

    ViewB 的装饰器已“执行”,但不是因为您正在查看 ViewA。这是因为 Python 在执行文件本身时装饰了该方法。例如,即使没有调用 func,以下内容也会打印 b

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

    关于'oh hi'不打印的问题;您能否尝试将装饰器添加到dispatch 而不是get(即,将以下内容添加到您的视图中):

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

    【讨论】:

    • 感谢您对多个装饰器调用的澄清。然而,调度方法不是我想要的 - 首先,它不起作用;),第二,我想对该类的 post/get 设置不同的限制:)
    • 根据您的编辑,我看到您解决了问题。公平地说,dispatch 或 get 或 post 之间的区别确实是相关的。
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2020-07-07
    • 2014-10-20
    • 2014-01-21
    • 2023-02-07
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多