Skip to main content
 首页 » 编程设计

python之如何在 Django 中创建装饰器来装饰 View

2025年05月04日41daizhj

我有看法:

@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 

请您参考如下方法:

如果你的 View 是这样的:

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 -这个参数将由装饰器提供)

但这确实是一个非常简单的案例,并不需要单独的装饰器(无论如何,它只是 View 定义中的一个附加行)。