【问题标题】:Apply a decorator depending on the request method根据请求方法应用装饰器
【发布时间】:2015-08-09 16:43:45
【问题描述】:

我有一个 Django 视图和一个装饰器 @token_required,但我想将此装饰器应用于函数只有当方法是 POST 时。 现在我有:

@token_required
def articles(request):
    if request.method == 'POST':
        ...
    if request.method == 'GET': 
        ...

但是装饰器是应用于GET和POST

【问题讨论】:

  • 唯一的方法是在装饰器中检查请求方法。由于装饰器应用于函数,因此根据定义,无论请求方法如何,都会调用它。
  • 只发送帖子请求到文章视图。为什么要把事情搞得太复杂?
  • 我的第一直觉是创建自己的装饰器,只有在请求类型是 POST 时才调用他们的装饰器。但这可能有点太元了。

标签: python django decorator


【解决方案1】:

将该装饰器包裹在您自己的装饰器中,以便在应用之前进行检查。如果是POST请求,在视图函数上调用token_required得到的函数,否则直接调用视图函数。

from functools import wraps

def token_required_on_post(f):
    require = token_required(f)

    @wraps(f)
    def wrapped(*args, **kwargs):
        if request.method == 'POST':
            return require(*args, **kwargs)

        return f(*args, **kwargs)

    return wrapped

@token_required_on_post
def articles(request):
    ...

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2013-07-19
    • 2016-03-23
    • 2016-07-24
    相关资源
    最近更新 更多