如何在Django中创建装饰器来装饰视图

时间:2012-08-05 15:56:51

标签: python django decorator

我有看法:

@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

1 个答案:

答案 0 :(得分:7)

如果您的观点如下:

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 - 此参数将由装饰者提供)

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

相关问题