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中使用item()方法遍历字典的例子
Aug 26 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
python生成式的send()方法(详解)
May 08 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
python pandas修改列属性的方法详解
Jun 09 Python
基于DataFrame改变列类型的方法
Jul 25 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
python requests模拟登陆github的实现方法
Dec 26 Python
windows下Pycharm安装opencv的多种方法
Mar 05 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 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
arguments对象
2006/11/20 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
原生js开发的日历插件
2017/02/04 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Python错误的处理方法
2020/06/23 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
电大毕业自我鉴定
2014/02/03 职场文书
员工保密承诺书
2014/05/28 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
房产协议书范本
2014/10/18 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
个人催款函范文
2015/06/23 职场文书
干部外出学习心得体会
2016/01/18 职场文书
2019公司管理制度
2019/04/19 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers