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

  • Post category:Python

permission_required()是Django框架中一个装饰器函数,主要用于控制视图函数的访问权限,只有具有指定权限的用户才能访问。

permission_required()的使用方法

使用permission_required()需要先导入 django.contrib.auth.decorators 中的 permission_required 函数,然后在视图函数上添加 @permission_required(permission, login_url=None, raise_exception=False) 装饰器,其中参数含义如下:

  • permission:必选参数,表示访问当前视图函数需要的权限,可以为字符串或一个字符串列表,如:permission_required('app_name.view_permission')permission_required(['app_name.view_permission', 'app_name.add_permission'])
  • login_url:可选参数,表示未登录用户重定向的URL,默认为settings.LOGIN_URL
  • raise_exception:可选参数,当为True时,如果用户未授权,则会引发django.core.exceptions.PermissionDenied 异常。

实例1:授权用户才能访问视图函数

假如在一个博客网站中,除了管理员之外,其他用户不能访问博客的编辑页面,可以在视图函数上添加permission_required装饰器限制访问权限。

from django.contrib.auth.decorators import login_required, permission_required

@permission_required('blog.change_post')
def edit_post(request, post_id):
    ...

上述代码表示只有拥有'blog.change_post'权限的用户才能访问该edit_post视图函数。

实例2:将视图函数转化为方法

假设有一个API接口,需要进行身份验证和授权才能访问,可以将其封装为一个类,并在类方法上添加permission_required装饰器。

from django.contrib.auth.decorators import permission_required
from django.views import View

class BlogAPI(View):

    @permission_required('blog.view_post')
    def get(self, request):
        """
        获取所有博客的API接口
        """
        return JsonResponse({'data': 'all posts'})

    @permission_required('blog.change_post')
    def post(self, request):
        """
        添加一篇新博客的API接口
        """
        return JsonResponse({'status': 'success'})

在上述代码中,如果用户没有对应的权限,则会被重定向到默认登录URL,或者抛出PermissionDenied异常。

综上所述,permission_required()是Django框架中一个非常实用的权限控制装饰器,能够帮助开发者控制视图函数的访问权限,从而保证应用的安全性和用户体验。