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 Web开发模板引擎优缺点总结
May 06 Python
python绘图库Matplotlib的安装
Jul 03 Python
python获取指定网页上所有超链接的方法
Apr 04 Python
详解Python中的循环语句的用法
Apr 09 Python
Django实现组合搜索的方法示例
Jan 23 Python
Python实现的直接插入排序算法示例
Apr 29 Python
Python迭代器定义与简单用法分析
Apr 30 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
Python配置pip国内镜像源的实现
Aug 20 Python
Python Numpy库的超详细教程
Apr 06 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php foreach、while性能比较
2009/10/15 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
原生js实现购物车功能
2020/09/23 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
Python  连接字符串(join %)
2008/09/06 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python怎么判断素数
2020/07/01 Python
Python descriptor(描述符)的实现
2020/11/15 Python
《第一次抱母亲》教学反思
2014/04/16 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
优秀高中学生评语
2014/12/30 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server