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查询Mysql时返回字典结构的代码
Jun 18 Python
Python字符串逐字符或逐词反转方法
May 21 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
在Python中使用AOP实现Redis缓存示例
Jul 11 Python
使用python编写监听端
Apr 12 Python
学生信息管理系统python版
Oct 17 Python
jupyter 导入csv文件方式
Apr 21 Python
python 双循环遍历list 变量判断代码
May 04 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
python批量修改交换机密码的示例
Sep 22 Python
django使用channels实现通信的示例
Oct 19 Python
python 闭包函数详细介绍
Apr 19 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 XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
Django自定义认证方式用法示例
2017/06/23 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python如何快速实现分布式任务
2017/07/06 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python实现调度算法代码详解
2017/12/01 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python基础教程之异常详解
2019/01/10 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
python使用列表的最佳方案
2020/08/12 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
工程监理应届生求职信
2013/11/09 职场文书
上课迟到检讨书
2014/01/19 职场文书
给客户的检讨书
2014/12/21 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
创业计划书之网吧
2019/10/10 职场文书