Django REST Framework之认证组件
什么是认证
认证即需要知道是谁在访问服务器,需要有一个合法身份。认证的方式可以有很多种,例如session+cookie、token等,这里以token为例。如果请求中没有token,我们认为这是未登录状态,有些接口要求必须登录才能访问,如果未登录,我们可以一些处理(比如重定向登录页、返回错误信息等)。
代码结构
urls.py
from django.conf.urls import url, include
from DemoApp.views import TestView urlpatterns = [
url(r'^test/', TestView.as_view()),
]
功能代码:utils/auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed,ValidationError
from DemoApp.models import User class MyAuth(BaseAuthentication):
def authenticate(self, request):
"认证逻辑"
# 做认证,判断是否登陆。首先拿到token,在数据库里去判断
token = request.query_params.get("token","")
if not token:
raise AuthenticationFailed("没有token")
try:
user = User.objects.filter(token=token).first()
if not user:
pass
raise AuthenticationFailed("无效的token")
except Exception as e:
msg = "无效的token" if hasattr(e, "messages") else "非法的token"
raise AuthenticationFailed(msg) return (user, token) # 返回值是一个元素,分别对应视图中request的user,auth
views.py
class TestView(APIView):
authentication_classes = [MyAuth, ] # 局部认证 def get(self, request, *args, **kwargs):
"通过认证后进入views类进行业务处理"
print(request.user)
print(request.auth)
pass
在上述代码中,实现了TestView视图类的认证功能。如果认证成功,向视图类中的request对象中返回requset.user和request.auth;如果认证失败,触发异常,不会进入视图处理,直接返回前端认证失败的结果。在实际的业务中这样并不合适,我们可以将其替代成重定向操作。
全局认证
- 将视图类中的authentication_classes属性删除
- settings.py配置文件中 RESTFRAMEWORK 添加配置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ] # 默认使用的认证类,全局认证
}
如果在全局认证下,有些接口不想加上认证,可以在这个类的属性 authentication_classes = [ ] 即可。
除了上述自己实现的认证类,REST Framework为我们了四种认证类:(直接在视图类中使用即可)
from rest_framework.authentication import BaseAuthentication, ......
1.BasicAuthentication 基于用户名密码
2.SessionAuthentication 基于session
3.TokenAuthentication 基于token,与示例中类似
4.RemoteUserAuthentication
源码分析
1.为什么要使用authentication_classes属性变量?
python 的面向对象编程中,我们首先要执行的方法肯定是dispatch方法,所以我们的分析入口就是dispatch方法,在dispatch方法中,可以看到,通过initialize_request方法将django原生的request进行了一次封装。由initialize_request方法的实现过程可以看出,将其封装实例化成了一个Request对象。而authenticators属性就是认证属性。
通过查看get_authenticators方法,可以知道,它的返回值是一个列表生成式,而这个列表生成式中所用的就是我们在认证类中赋值authenticatin_classes属性变量。在查找该变量的定义位置,就看到了它是通过settings配置文件来实现赋值的,除非,在子类中将其赋值。我们的代码就是这样做的。同时,也可以看出,我们可以修改settings配置文件来为全局定义认证规则。
2.为什么认证类中要使用authenticate方法?
回到前面说是的dispatch方法来,在做完了对django原生的request的封装和实例化后,紧接着就会开始认证(try...中,捕获异常,如果没有捕获到异常,说明认证成功,就会继续执行下面的反射过程)。认证的过程就包含在上图中的inital方法中,有图可知,是通过perform_authentication方法实现的认证。
在perform_authentication方法中可以看到,只调用了一个request.user,而这个user一定是方法,不会是属性变量,因为如果是属性变量,那么就一定有语法错误,变量一定是要赋值的,不可能孤零零的写到那里。我们在源码中找到它,就明白了,之所以它能这么写,就是因为有了property装饰器。在user方法中找到_authenticate方法,这就是认证的方法。
在这个方法中,一切答案都就找到了。首先看authenticators,是不是很眼熟,没错它就是前面说的,封装和实例化原生request的Request类中所定义的属性变量。在实例化时,我们就将authentication_classes列表的值通过get_authenticators方法中的列表生成式赋值给了authenticators。再往下看,authenticator.autheneicate(self)中的authenticator是不是就是我们自己定义的认证类,而它在源码中要做“.authenticate(self)”的操作,那自然而然,我们定义的认证类中要实现这个方法了。
3.为什么认证成功后的返回值在request.user和request.auth中?
由上述图可知,当我们认证成功后会执行“self.user, self.auth = user_auth_tuple”代码,我们在认证类定义的方法authenticate的返回值就保存在 user_auth_tuple中,所以我们通过request.user 和 request.auth 就可以获取到了
Django REST Framework之认证组件的更多相关文章
- DRF Django REST framework 之 认证组件(五)
引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...
- 基于django rest framework做认证组件
先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...
- Django Rest framework 之 认证
django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...
- django rest framework用户认证
django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...
- restful framework之认证组件
一.认证介绍 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二.局部使用 (1)models层: class Us ...
- Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析
认证组件 权限组件 频率组件
- Django rest framework 的认证流程(源码分析)
一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...
- Django 学习之用户认证组件auth与User对象
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个. 1 .authenticate() ...
- Django Rest Framework之认证
代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpa ...
随机推荐
- java实践经验几种常见数据库连接池的使用比较
经历的几个产品及项目中,包括了各种数据库及应用服务器,基本上几种常见的数据库连接池都用到了,根据使用的情况把这些连接池比较一下吧.(http://m.0834jl.com) 感觉在介绍之前有必要阐述一 ...
- SPSS分析过程可自动化,你知道吗
SPSS分析过程可自动化,你知道吗 在使用SPSS的过程中,有时候会遇到重复进行相同分析操作的情况,或者分析过程很复杂的情况. 这时候我们多么希望SPSS能够记住上一次的分析步骤,不要让我们重复的去点 ...
- Acer电脑【no bootable device】引导修复
时隔一年,又遇上了我的电脑出现 No Bootable Device 的开机提示,进不了系统. 那么怎么办呢? // 本文修复方式仅针对宏碁电脑且分区表为MBR的情况.按如下方法引导并未 ...
- Cesium官方教程10--高级粒子特效
原文地址:https://cesiumjs.org/tutorials/Particle-Systems-More-Effects-Tutorial/ 高级粒子系统特效 这篇教程学习更多的效果,包括天 ...
- PAT甲级——A1082 Read Number in Chinese
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...
- python 第三方库的安装方法
一.看更大的python世界 python 全球计算生态的主站:python 社区 www.pypi.org 二.安装第三方库 1) pip 命令安装方法 1.1 安装第三方库 命令行输入pip in ...
- Python-pip更改国内源
windows方式: 1.打开任意文件夹,在上方地址栏中输入%appdata% 2.在此目录里新建文件夹pip 3.在pip文件夹里新建文件名:pip.ini 4.把以下内容复制到pip.ini中,保 ...
- Cmp- Linux必学的60个命令
1.作用 cmp(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户. 2.格式 cmp[options] 文件名 3.[options]主要参数 -l: 将字节以 ...
- webpack4.0打包的时候一些技巧
4.0的webpack要比之前的版本强大的不是一点点 打包的时候也做了很多优化 然后说一些这段时间发现的有趣的技巧 1. 打包出来的文件很大,不知道是什么原因可以用 webpack-bundle-an ...
- light oj 1105 规律
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...