Django Rest framework权限的详细用法


Posted in Python onJuly 25, 2019

前言

我们都听过权限,那么权限到底是做什么的呢.

我们都有博客,或者去一些论坛,一定知道管理员这个角色,

比如我们申请博客的时候,一定要向管理员申请,也就是说管理员会有一些特殊的权利,是我们没有的.

==这些对某件事情决策的范围和程度,我们叫做权限==,权限是我们在项目开发中经常用到的.

本文将详细讲述DRF框架为我们提供的权限组件的使用方法.

源码剖析

DRF的版本控制、认证、权限、频率组件都在initial方法里初始化.

Django Rest framework权限的详细用法

我们点进去看看:

Django Rest framework权限的详细用法

其实我们版本、认证、权限、频率控制走的源码流程大致相同.

==我们的权限类中一定要有has_permission方法——框架为我们提供的钩子.==

我们再来看看rest_framework.permissions文件中存放的框架为我们提供的所有权限的方法:

Django Rest framework权限的详细用法

==注意图中的BasePermission类,这个类是框架为我们提供的基础权限类,我们自定义的权限类都要继承此类.==

调用方法

在视图中调用:

permission_classes = ["自定义的权限类", ]

全局调用:

REST_FRAMEWORK = {
 # 配置全局认证
 'DEFAULT_AUTHENTICATION_CLASSES': ["指定自定义的权限类", ]
}

权限的详细用法

请结合【DRF认证组件详细用法】此文献中的自定义认证类来阅读如下步骤.

第一步 准备数据库文件和数据

from django.db import models

class UserInfo(models.Model):
 name = models.CharField(max_length=32)
 pwd = models.CharField(max_length=32)
 token = models.UUIDField(null=True, blank=True)
 user_type = ((1, "普通用户"), (2, "管理员"))
 type = models.IntegerField(choices=user_type, default=1)

数据如下:

mysql> select * from blog_userinfo;
+----+-----------+-----------+------+-------+
| id | name | pwd | type | token |
+----+-----------+-----------+------+-------+
| 1 | 花千骨 | huaqiangu | 1 | NULL |
| 2 | 锦觅 | jinmi | 2 | NULL |
+----+-----------+-----------+------+-------+
2 rows in set (0.00 sec)

第二步 自定义一个权限组件

from rest_framework.permissions import BasePermission # 导入基础的权限类


class MyPermission():
 """必备的属性和方法,基本固定的逻辑"""

 message = "普通用户无权访问的数据"

 def has_permission(self, request, view):
 """
 注意:
 源码中初始化时的顺序是认证在前,权限在后,所以只要认证通过
 我们这里就可以使用request.user拿到用户信息,request.auth拿到用户对象
 """
 # 获取认证控制的返回值
 print("用户名:" request.user)
 user_obj = request.auth
 if user_obj.type == 1:
 return False # 普通用户
 return True # 管理员

第三步 urls.py

from django.conf.urls import url
from blog.views import LoginView, TestPermissionView

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^login/$', LoginView.as_view()), # 用于登陆
 url(r'^test_permission/$', TestPermissionView.as_view()), # 用于权限测试
]

第四步 views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 导入自定义的认证组件
from .permission import MyPermission # 导入自定义的权限控制组件
from .models import UserInfo # 导入用户信息表
import uuid # 用于生成uuid


class LoginView(APIView):
 """用于登陆验证并生成UUID的视图"""

 def post(self, request):
 name = request.data.get('name')
 pwd = request.data.get('pwd')
 user_obj = UserInfo.objects.filter(name=name, pwd=pwd).first()
 if user_obj:
 u4 = uuid.uuid4() # 生成uuid4
 user_obj.token = u4
 user_obj.save()
 return Response(str(u4))
 return Response("用户名或密码错误")


class TestPermissionView(APIView):
 """用于测试权限的视图"""

 # 在视图中增加如下属性,即表明此视图要走如下组件的逻辑
 authentication_classes = [MyAuth, ] # 自定义的认证组件
 permission_classes = [MyPermission, ] # 权限控制组件

 def get(self, request):
 return Response("这里是管理员能访问的数据")

好了,我们可以测试了.

我们先登陆一个普通用户:

Django Rest framework权限的详细用法

然后复制返回的UUID,再去访问权限测试页面:

Django Rest framework权限的详细用法

可见,返回的内容为普通用户无权限.

我们再来登陆一个管理员:

Django Rest framework权限的详细用法

然后复制返回的UUID,再去访问权限测试页面:

Django Rest framework权限的详细用法

可见,返回的内容为管理员能访问的数据.

好了,关于DRF的权限就到这里了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
用pandas按列合并两个文件的实例
Apr 12 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
基于Python的Jenkins的二次开发操作
May 12 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Python logging模块原理解析及应用
Aug 13 Python
Django Rest framework解析器和渲染器详解
Jul 25 #Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 #Python
Django MEDIA的配置及用法详解
Jul 25 #Python
Django打印出在数据库中执行的语句问题
Jul 25 #Python
python requests指定出口ip的例子
Jul 25 #Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 #Python
Python使用指定端口进行http请求的例子
Jul 25 #Python
You might like
php笔记之:AOP的应用
2013/04/24 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
asp.net和php的区别点总结
2019/10/10 PHP
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
python多线程socket编程之多客户端接入
2017/09/12 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
python跨文件使用全局变量的实现
2020/11/17 Python
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
班级聚会策划书
2014/01/16 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
消防标语大全
2014/06/07 职场文书
服装设计专业求职信
2014/06/16 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
Python基础详解之邮件处理
2021/04/28 Python
python代码实现备忘录案例讲解
2021/07/26 Python
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
MySQL添加索引特点及优化问题
2022/07/23 MySQL