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 Tkinter基础控件用法
Sep 03 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
Python管理Windows服务小脚本
Mar 12 Python
Django之路由层的实现
Sep 09 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Pyspark获取并处理RDD数据代码实例
Mar 27 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
python 实现简单的计算器(gui界面)
Nov 11 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
python正则表达式re.search()的基本使用教程
May 21 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
php查询操作实现投票功能
2016/05/09 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
护理实习自我鉴定
2013/12/14 职场文书
《假如》教学反思
2014/04/17 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
2014年后勤工作总结
2014/11/18 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
Python使用DFA算法过滤内容敏感词
2022/04/22 Python