【问题标题】:How create decorator in Django for decorating view如何在 Django 中创建装饰器来装饰视图
【发布时间】:2012-08-02 19:24:23
【问题描述】:

我有意见:

@decorator
def func(request):
  hello = "hello"
  return render_to_responce("test.html", locals() )

和模板test.html:

{{ hello }}
{{ username }}

我想为func(request) 编写装饰器,它将一个变量USERNAME 添加到函数中,并在模板中返回两个参数。我试图使它如下:

def decorator(func):
    def wrapper( request, *args, **kwargs):
        username = request.user.username
        q = func(request, *args, **kwargs)
        #what I need add here I do not know ...
        return q   
    return wrapper

【问题讨论】:

  • 你认为你为什么想要一个装饰器?你能解释一下用例吗? (您是否也可以清理您的代码,使其语法正确且更具可读性)?

标签: python django decorator


【解决方案1】:

如果您的视图如下所示:

def func(request, username):
    hello = "hello"
    return render_to_responce("test.html", locals() )

你可以这样写一个装饰器:

from functools import wraps
def pass_username(view):
    @wraps(view)
    def wrapper(request, *args, **kwargs):
        return view(request, request.user.username, *args, **kwargs)
    return wrapper

然后像这样使用它:

@pass_username
def func(request, username):
    hello = "hello"
    return render_to_response("test.html", locals())

(只要确保您将在urls.py 中将其视为def func(request):,没有username - 此参数将由装饰器提供)

但这确实是一个非常简单的情况,并不需要单独的装饰器(无论如何,它只是视图定义中的额外一行)。

【讨论】:

  • 同意这是一个简单的案例,不需要装饰器,但无论如何都会使用functools.wraps
  • @JonClements:同意,这确实是更好的方法。我已经更新了我的答案。
猜你喜欢
  • 2015-11-18
  • 2021-07-12
  • 2018-10-18
  • 2021-06-22
  • 2014-02-13
  • 2014-06-07
  • 2016-08-14
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多