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线程的两种编程方式
Apr 14 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
Python3.遍历某文件夹提取特定文件名的实例
Apr 26 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
python实现列表的排序方法分享
Jul 01 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Python实现点云投影到平面显示
Jan 18 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
通过代码实例了解Python sys模块
Sep 14 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
django数据库migrate失败的解决方法解析
2018/02/08 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
教学实习自我评价
2014/01/28 职场文书
博士生导师推荐信
2014/07/08 职场文书
生活小常识广播稿
2014/09/16 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
护士旷工检讨书
2015/08/15 职场文书