Python Django中间件到';什么也不做';如果符合某些标准
我试图弄清楚如何在python/django中创建身份验证中间件。以下是一个例子:Python Django中间件到';什么也不做';如果符合某些标准,python,django,django-views,Python,Django,Django Views,我试图弄清楚如何在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) pr
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')
上述方法是否有效?在这种情况下,如果条件不是故意的,它将重新定向,但如果一切正常,它将通过
另外,对于我试图在上面创建的内容,什么是合适的术语?它会被称为“中间件”还是应该变成“视图装饰器”?否:因为
中间件功能中的返回将不会返回视图外的内容。这只是中间件功能的结果,您决定根本不使用它
此外,您不能在此处使用user
,因为这是secure\u view
的局部变量,而不是global
或non-local
变量(无论如何,这都是糟糕的设计)
最后,它不是Django定义中间件的方式。在Django中,中间件是所有视图的一组“预处理”和“后处理”(以及日志记录)。在这里,您的目标只是“操纵”单个视图
我建议实施一个装饰器,比如:
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')
不,因为返回
不会返回到视图之外,而且这不是真正的“中间件”(Django中的定义)。@WillemVanOnsem——感谢您的回复。如果有必要,我如何“返回”重定向?
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')