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基础教程之序列详解
Aug 29 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
Python进程间通信用法实例
Jun 04 Python
Python画图学习入门教程
Jul 01 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
Pyspark获取并处理RDD数据代码实例
Mar 27 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 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模拟HTTP认证
2006/10/09 PHP
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
vue-loader教程介绍
2017/06/14 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
在购买印度民族服饰:Soch
2020/09/15 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
销售人员中英文自荐信
2013/09/22 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
四风问题查摆材料
2014/08/25 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA