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实现的防DDoS脚本
Feb 08 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
python字典快速保存于读取的方法
Mar 23 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
Python socket处理client连接过程解析
Mar 18 Python
Django自定义YamlField实现过程解析
Nov 11 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
python中的sort方法使用详解
2014/07/25 Python
python操作mysql代码总结
2018/06/01 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python制作mysql数据迁移脚本
2019/01/01 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
法律进社区实施方案
2014/03/21 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
幼儿园标语大全
2014/06/19 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2014年党委工作总结
2014/11/22 职场文书
2014年预算员工作总结
2014/12/05 职场文书
2015年财务部工作总结
2015/04/10 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
React列表栏及购物车组件使用详解
2021/06/28 Javascript
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
golang定时器
2022/04/14 Golang