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中的pydoc模块和distutils模块
Apr 13 Python
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
Python使用Supervisor来管理进程的方法
May 28 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
Python对List中的元素排序的方法
Apr 01 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Flask框架模板继承实现方法分析
Jul 31 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
使用Python实现画一个中国地图
Nov 23 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python井字棋游戏实现人机对战
Apr 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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
php命令行写shell实例详解
2018/07/19 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
javascript 面向对象 function类
2010/05/13 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
javascript实现移动端上传图片功能
2020/08/18 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
pywinauto自动化操作记事本
2019/08/26 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Python之字典添加元素的几种方法
2020/09/30 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
简历自荐信
2013/12/02 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
公司总经理岗位职责
2015/04/01 职场文书
护士岗位竞聘书
2015/09/15 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python