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

  • Post category:Python

下面详细讲解Django的permission_required()函数的作用与使用方法的完整攻略。

作用

permission_required()函数是Django中用于控制视图权限的一种装饰器。通常情况下,我们可以在视图函数或类的方法上使用该装饰器,用于根据用户的权限来判断是否允许访问该视图。

使用方法

1. 函数视图

在将permission_required()装饰器应用到函数视图上时,我们需要指定所需要的权限。例如:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.view_poll')
def my_view(request):
    # 该用户有权限
    pass

上述代码中,我们将permission_required()装饰器应用到了函数视图my_view上,并指定了需要的权限为polls.view_poll。如果当前登录用户没有该权限,则会被重定向到登录页面。

2. 类视图

当我们需要将permission_required()装饰器应用到类视图上时,我们需要使用method_decorator()进行包装,并将其应用到dispatch()方法上。例如:

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import permission_required
from django.views.generic import View

@method_decorator(permission_required('polls.view_poll'), name='dispatch')
class MyView(View):
    # 该用户有权限
    pass

上述代码中,我们将permission_required()装饰器应用到了类视图MyView上,并指定了需要的权限为polls.view_poll。如果当前登录用户没有该权限,则会被重定向到登录页面。

示例

示例一:限制视图的访问权限

假设我们有一个投票应用,并添加了一个视图用于显示投票结果:

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

@permission_required('polls.view_poll')
def poll_results(request, poll_id):
    poll = Poll.objects.get(pk=poll_id)
    return render(request, 'polls/results.html', {'poll': poll})

上述代码中,我们将permission_required()装饰器应用到了poll_results视图上,并指定了需要的权限为polls.view_poll。如果当前登录用户没有该权限,则会被重定向到登录页面。

示例二:限制访问模型的管理页面

假设我们有一个模型MyModel,并使用Django自带的后台管理来管理该模型。如果我们希望只有一部分用户能够访问该模型的管理页面,我们可以在admin.py文件中使用permission_required()装饰器:

from django.contrib.admin import ModelAdmin
from django.contrib.auth.decorators import permission_required

class MyModelAdmin(ModelAdmin):
    @permission_required('polls.view_poll')
    def changelist_view(self, request, extra_context=None):
        # 显示模型列表的视图
        pass

上述代码中,我们将permission_required()装饰器应用到了changelist_view方法上,并指定了需要的权限为polls.view_poll。如果当前登录用户没有该权限,则会被重定向到登录页面。