详解Django的 permission_required() 函数:装饰器,限制未授权用户访问视图

  • Post category:Python

permission_required()是Django框架中的一个装饰器函数,其作用就是用于限制用户需要具备某个权限才能访问被该装饰器装饰的视图函数。该函数能够在视图函数执行之前验证权限,如果没有权限,则重定向到指定的URL或者跳转到指定的页面。在Django中,权限通常由Django内置的auth应用程序处理,也可以使用第三方库如django-guardian来进行复杂的授权操作。

permission_required()的使用方法非常简单。我们可以在视图函数前使用该装饰器,并传入需要的权限名称,具体如下:

from django.contrib.auth.decorators import permission_required
from django.shortcuts import render

@permission_required('auth.view_user')
def user_list(request):
    users = User.objects.all()
    return render(request, 'user_list.html', {'users': users})

在上面的例子中,我们使用了权限名称'auth.view_user',该名称代表用户拥有查看用户列表的权限。如果用户没有该权限则会被重定向到默认的登录页面。如果想要自定义重定向页面,可以通过login_url参数进行设置,例如:

@permission_required('auth.view_user', login_url='/my_login_page/')

除了单一权限限制,还可以对多个权限进行限制。只需要将需要的权限名称都放到一个列表中即可,例如:

@permission_required(['auth.view_user', 'auth.change_user'])

当用户不满足该列表中的所有权限时,会被重定向到设置的登录页面。

以下是另一个使用实例,演示一个函数需要两种权限才能被执行:

@permission_required(['auth.view_user', 'auth.change_user'], login_url='/my_login_page/')
def modify_user(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    # 稍后在此函数中进行修改用户的逻辑。
    ...

上述代码中,modify_user函数需要拥有auth.view_userauth.change_user这两个权限才能被执行。如果用户不具备这两个权限,页面会被重定向到自定义的登录页面。