Skip to main content
 首页 » 编程设计

python之如果满足某些条件,则 Django 中间件为 'do nothing'

2024年09月07日34mfryf

我正在尝试弄清楚如何在 python/django 中创建身份验证中间件。这是一个例子:

def middleware_function(request): 
    if not user.is_admin: 
        return redirect('login') 
    else: 
        pass 
 
def secure_view(request): 
    user = request.usera 
    middleware_function(request) 
 
    print ("ok, you've passed security") 
    return render(request, 'secure_view.html') 

以上是执行此操作的“有效”方法吗?在那里,如果条件不是意味着它会重新定向,但如果一切正常,它会通过?

此外,我在上面尝试创建的内容的正确术语是什么?它会被称为“中间件”还是应该变成“ View 装饰器”?

请您参考如下方法:

否:因为middleware_function 中的return 将不会返回 View 之外的内容。它只是 middleware_function 的结果,您决定根本不对它做任何事情。

此外,您不能在此处使用 user,因为它是 secure_view 的本地变量,而不是全局,或 nonlocal 一个(无论如何这都是糟糕的设计)。

最后,它不是 Django 定义中间件的方式的中间件。在 Django 中间件中,有一组用于所有 View 的“预处理”和“后处理”(以及日志记录)。在这里,您的目标只是“操纵”单个 View 。

我建议实现一个装饰器,比如:

from functools import wraps 
 
def admin_required(view_func): 
    @wraps(view_func) 
    def wrapped(request, *args, **kwargs) 
    if request.user.is_admin: 
        return view_func(request, *args, **kwargs) 
    else: 
        return redirect('login') 
    return wrapped

然后您可以将装饰器添加到您的 View 中:

<b>@admin_required</b> 
def secure_view(request): 
    print ("ok, you've passed security") 
    return render(request, 'secure_view.html')

然而,Djano 已经有了一个装饰器 user_passes_test [Django-doc] :

from django.contrib.auth.decorators import <b>user_passes_test</b> 
 
<b>@user_passes_test(lambda user: user.is_superuser)</b> 
def secure_view(request): 
    print ("ok, you've passed security") 
    return render(request, 'secure_view.html')