我正在尝试弄清楚如何在 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')
