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的Django框架中更新数据库数据的方法
Jul 17 Python
在Python的Django框架中包装视图函数
Jul 20 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
python 实现目录复制的三种小结
Dec 04 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
pytorch数据预处理错误的解决
Feb 20 Python
解决django FileFIELD的编码问题
Mar 30 Python
python 实现单例模式的5种方法
Sep 23 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获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
php 基础函数
2017/02/10 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
快速了解Python中的装饰器
2018/01/11 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
python代码xml转txt实例
2020/03/10 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
高校自主招生自荐信
2013/12/09 职场文书
社区活动邀请函范文
2014/01/29 职场文书
英语求职信范文
2014/05/23 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js