Django Rest framework认证组件详细用法


Posted in Python onJuly 25, 2019

本文详细讲述了DRF认证组件的原理以及用法.

源码剖析

讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.

而在initial方法里有我们的认证、权限、频率组件,如下图:

Django Rest framework认证组件详细用法

我们再点进去认证组件看看:

Django Rest framework认证组件详细用法

可以看到,我们的权限组件返回的是request.user,那么这里返回的request是新的还是旧的呢?

initial方法是在request重新赋值之后执行的,所以我们这里的request是新的——也就是Request类的实例化对象.

所以,这个user一定是一个静态方法,我们进去看看:

Django Rest framework认证组件详细用法

Django Rest framework认证组件详细用法

我没在这里反复的截图跳转页面,大家可以尝试着自己去找.

通过上面的分析,我们基本可以知道我们的认证类一定要实现的方法、返回值的类型,以及视图中要配置的参数:

authentication_classes = ["认证组件类", ]

如果需要全局验证,则在配置文件中加上此配置:

REST_FRAMEWORK = {
  # 配置全局认证
  'DEFAULT_AUTHENTICATION_CLASSES': ["blog.auth.MyAuth", ],
}

认证组件的详细用法

第一步 准备数据库文件和数据

# models.py
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)

数据如下:

mysql> select * from blog_userinfo;
+----+-----------+-----------+-------+
| id | name   | pwd    | token |
+----+-----------+-----------+-------+
| 1 | 花千骨  | huaqiangu |    |
+----+-----------+-----------+-------+
1 row in set (0.00 sec)

第二步 自定义一个认证类

from rest_framework.authentication import BaseAuthentication # > 导入认证类
from rest_framework.exceptions import AuthenticationFailed # 用于抛出错误信息
from .models import UserInfo # 导入用户信息表


class MyAuth(BaseAuthentication):
  def authenticate(self, request):
    """自定义的认证类中必须有此方法以及如下的判断和两个返回值"""

    # 1. 获取token
    token = request.query_params.get('token')

    # 2. 判断是否成功获取token
    if not token:
      raise AuthenticationFailed("缺少token")

    # 3. 判断token是否合法
    try:
      user_obj = UserInfo.objects.filter(token=token).first()
    except Exception:
      raise AuthenticationFailed("token不合法")

    # 4. 判断token在数据库中是否存在
    if not user_obj:
      raise AuthenticationFailed("token不存在")

    # 5. 认证通过
    return (user_obj.name, user_obj)
    # 注意,权限组件会用到这两个返回值

第三步 urls.py

from django.conf.urls import url
from blog.views import LoginView, TestAuthView

urlpatterns = [
  url(r'^login/$', LoginView.as_view()), # 用于登陆
  url(r'^test/$', TestAuthView.as_view()), # 用于认证测试
]

第四步 views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 导入自定义的认证组件
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(u4)
    return Response("用户名或密码错误")


class TestAuthView(APIView):
  """用于认证测试的视图"""
  
  # 在视图中增加此配置,即表明此视图要走认证逻辑认证
  # 认证组件可以写多个
  authentication_classes = [MyAuth, ]

  def get(self, request):
    return Response("认证测试")

好了,我们来测试吧.

首先,登陆并生成UUID:

Django Rest framework认证组件详细用法

成功提交数据后,将生成并返回UUID:

Django Rest framework认证组件详细用法

然后,复制UUID,去测试认证:

Django Rest framework认证组件详细用法

如果我们不指定token:

Django Rest framework认证组件详细用法

或者指定错误的、不存在的token,都将被抛出错误.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现配置文件备份的方法
Jul 30 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
python如何在循环引用中管理内存
Mar 20 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
如何利用python进行时间序列分析
Aug 04 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
Python使用protobuf序列化和反序列化的实现
May 19 Python
Django Rest framework权限的详细用法
Jul 25 #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
You might like
js打印纸函数代码(递归)
2010/06/18 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
jquery模拟进度条实现方法
2015/08/03 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
Angular2库初探
2017/03/01 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
python绘制中国大陆人口热力图
2018/11/07 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python urllib爬虫模块使用解析
2019/09/05 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
董事长助理岗位职责
2014/02/18 职场文书
企业2014年度工作总结
2014/12/10 职场文书
2015年行政部工作总结
2015/04/28 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
golang生成并解析JSON
2022/04/14 Golang