我试图弄清楚如何在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')
以上是执行此操作的“有效”方法吗?在这种情况下,如果没有条件,它将重新定向,但如果一切正常,则可以通过?
此外,对于我上面要创建的内容,合适的术语是什么?它会被称为“中间件”还是应该变成“视图装饰器”?
答案 0 :(得分:3)
否:由于return
中的middleware_function
将不返回视图之外的内容。它只是middleware_function
的结果,您决定完全不对其进行任何操作。
此外,您不能在此处使用user
,因为它是secure_view
的 local 变量,而不是global
或nonlocal
(无论如何,这都是很糟糕的设计)。
最后,它不是Django定义中间件的方式的中间件。在Django中间件中,用于 all 视图的一组“预处理”和“后处理”(以及日志记录)。在这里,您仅打算“操纵”单个视图。
我建议实现一个装饰器,例如:
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
然后可以将装饰器添加到视图中:
@admin_required
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 user_passes_test
@user_passes_test(lambda user: user.is_superuser)
def secure_view(request):
print ("ok, you've passed security")
return render(request, 'secure_view.html')