如果满足某些条件,Django中间件将“不执行任何操作”

时间:2018-10-12 19:27:16

标签: 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)

    print ("ok, you've passed security")
    return render(request, 'secure_view.html')

以上是执行此操作的“有效”方法吗?在这种情况下,如果没有条件,它将重新定向,但如果一切正常,则可以通过?

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

1 个答案:

答案 0 :(得分:3)

:由于return中的middleware_function返回视图之外的内容。它只是middleware_function的结果,您决定完全不对其进行任何操作。

此外,您不能在此处使用user,因为它是secure_view local 变量,而不是globalnonlocal (无论如何,这都是很糟糕的设计)。

最后,它不是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')