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

我试图弄清楚如何在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')
上述方法是否有效?在这种情况下,如果条件不是故意的,它将重新定向,但如果一切正常,它将通过


另外,对于我试图在上面创建的内容,什么是合适的术语?它会被称为“中间件”还是应该变成“视图装饰器”?

:因为
中间件功能中的
返回将不会返回视图外的内容。这只是
中间件功能的结果,您决定根本不使用它

此外,您不能在此处使用
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')