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

  • Post category:Python

当我们使用Django框架进行开发时,有时候需要对用户进行身份验证和权限控制。Django提供了许多方便的方法来实现这些功能之一就是permission_required()函数。

作用

permission_required()函数的作用是确保用户具有特定的权限才能访问某个视图函数或生成视图函数的URL。

使用方法

使用permission_required()函数需要完成以下几个步骤:

1. 将permission_required导入views.py文件

在views.py文件中导入permission_required函数:

from django.contrib.auth.decorators import permission_required

2. 配置权限并关联参数

在需要进行权限控制的视图函数前使用permission_required()函数配置权限。更新视图函数的定义如下:

from django.contrib.auth.decorators import permission_required

@permission_required('auth.can_view_users')
def view_users(request):
    # ...

在上面的代码中,'auth.can_view_users'是需要授权的权限名称,具体的权限名称在权限定义时进行说明。

3. 修改url配置

现在,只有具有auth.can_view_users权限的用户才能访问/users/ URL。为了将URL与视图函数关联起来,需要在项目的urls.py文件中添加以下代码:

from django.contrib.auth.decorators import permission_required
from django.urls import path
from .views import view_users

urlpatterns = [
    path('users/', permission_required('auth.can_view_users')(view_users), name='view_users'),
    # ...
]

在上面的代码中,permission_required('auth.can_view_users')部分用于配置特定的权限,而view_users是url与视图函数绑定的参数。

4. 测试

现在可以测试一下访问该视图函数或URL的用户是否拥有权限。

示例

以下是两个回答问题时可以使用的示例:

示例1

Q:可以给出一个具体的使用场景吗?

A:假设有一个视图函数,用于创建一篇文章。为了确保只有作者才能访问该视图函数,需要检查用户是否具有'blog.add_post'权限。代码如下:

from django.contrib.auth.decorators import permission_required

@permission_required('blog.add_post')
def create_post(request):
    # Only users with the blog.add_post permission can access this view
    # ...

只有具有blog.add_post权限的用户才能访问create_post视图函数。

示例2

Q:能否举一些更加具体的案例说明这个函数是怎么使用的?

A:例如,在一个电商网站上,管理员可以管理所有的商品。为了保证管理员才可以使用管理功能,网站开发人员可以在相应的视图函数前面加上permission_required()装饰器。

from django.contrib.auth.decorators import permission_required

@permission_required('store.manage_items')
def manage_items(request):
    # ...

上述代码确保只有具有store.manage_items权限的管理员才能使用管理商品的功能。只有这些用户才能访问manage_items视图函数。