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:同意,这确实是更好的方法。我已经更新了我的答案。