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抓取网页中的图片示例
Feb 28 Python
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
跟老齐学Python之网站的结构
Oct 24 Python
有趣的python小程序分享
Dec 05 Python
python实现日常记账本小程序
Mar 10 Python
Python实现求一个集合所有子集的示例
May 04 Python
Python中函数参数调用方式分析
Aug 09 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
python适合做数据挖掘吗
Jun 16 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
php多进程应用场景实例详解
2019/07/22 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Javascript typeof 用法
2008/12/28 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
jQuery基础知识小结
2014/12/22 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
实习自荐信
2013/10/13 职场文书
服务宗旨标语
2014/07/01 职场文书
环卫工作个人总结
2015/03/04 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书