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 调用Java实例详解
Jun 02 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
Python os.access()用法实例
Feb 18 Python
基于python if 判断选择结构的实例详解
May 06 Python
python进程和线程用法知识点总结
May 28 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
python生成特定分布数的实例
Dec 05 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
基于Python爬取素材网站音频文件
Oct 21 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
pycharm代码删除恢复的方法
Jun 26 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使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
Js的MessageBox
2006/12/03 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
javascript连续赋值问题
2015/07/08 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python实现邮件循环自动发件功能
2020/09/11 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
编码实现字符串转整型的函数
2012/06/02 面试题
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
中学生思想品德评语
2014/12/31 职场文书
2015年度团总支工作总结
2015/04/23 职场文书