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实现监控linux性能及进程消耗性能的方法
Jul 25 Python
Python版微信红包分配算法
May 04 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
python实践项目之监控当前联网状态详情
May 23 Python
详解python破解zip文件密码的方法
Jan 13 Python
python 的topk算法实例
Apr 02 Python
基于python 凸包问题的解决
Apr 16 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 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、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
Python开发编码规范
2006/09/08 Python
python删除文件示例分享
2014/01/28 Python
python打开网页和暂停实例
2014/09/30 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Django Highcharts制作图表
2016/08/27 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
浅谈python之新式类
2018/08/12 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
护士自我评价范文
2014/01/25 职场文书
学校安全生产承诺书
2014/05/23 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL