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

Python 如何在Django中为装饰视图创建装饰器,python,django,decorator,Python,Django,Decorator,我认为: @decorator def func(request): hello = "hello" return render_to_responce("test.html", locals() ) 和template test.html: {{ hello }} {{ username }} 我想为func(request)编写decorator,它向函数中添加一个变量USERNAME,并在模板中返回两个参数。我试图做到如下: def decorator(func): d

我认为:

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

{{ hello }}
{{ username }}
我想为
func(request)
编写decorator,它向函数中添加一个变量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

如果您的视图如下所示:

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())
然后像这样使用它:

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(请求):
,而不使用
username
-此参数将由装饰程序提供)


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

如果您的视图如下所示:

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())
然后像这样使用它:

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(请求):
,而不使用
username
-此参数将由装饰程序提供)


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

为什么您认为需要decorator?你能解释一下这个用例吗?(你能不能也清理一下你的代码,让它在语法上更正确、更可读)?你为什么认为你需要一个装饰师?你能解释一下这个用例吗?(您是否也可以清理代码,使其语法正确且更具可读性)?同意这是一个简单的案例,不需要修饰程序,但可以使用
functools.wrapps
anyway@JonClements:同意,这确实是更好的方法。我已经更新了我的答案。我同意这是一个简单的案例,不需要装饰器,但会使用
functools.wrapps
anyway@JonClements:同意,这确实是更好的方法。我已经更新了我的答案。