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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
Python标准库笔记struct模块的使用
Feb 22 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
使用python实现飞机大战游戏
Mar 23 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php json_encode值中大括号与花括号区别
2013/09/30 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
Python正则表达式和元字符详解
2018/11/29 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
python读文件的步骤
2019/10/08 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
七年级生物教学反思
2014/01/30 职场文书
法学函授自我鉴定
2014/02/06 职场文书
自我管理的活动方案
2014/08/25 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
小学三年级作文之写景
2019/11/05 职场文书