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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
在Python中使用列表生成式的教程
Apr 27 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
python学习必备知识汇总
Sep 08 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
python列表使用实现名字管理系统
Jan 30 Python
pytorch 自定义数据集加载方法
Aug 18 Python
Python实现查找数据库最接近的数据
Jun 08 Python
Python Selenium操作Cookie的实例方法
Feb 28 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php实现mysql封装类示例
2014/05/07 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript中的类继承
2010/11/25 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
js打造数组转json函数
2015/01/14 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
numpy数组广播的机制
2019/07/12 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
电子工程专业毕业生求职信
2014/03/14 职场文书
法人代表授权委托书
2014/04/08 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
村创先争优活动总结
2014/08/28 职场文书
大连星海广场导游词
2015/02/10 职场文书
办公用品质量保证书
2015/05/11 职场文书
法人代表证明书范本
2015/06/18 职场文书
婚宴领导致辞
2015/07/28 职场文书
信息技术课教学反思
2016/02/23 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
mysql如何能有效防止删库跑路
2021/10/05 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技