rest_framework之认证源码剖析
如果我们写API有人能访问,有人不能访问,则需要些认证。 如何知道该用户是否已登入?
如果用户登入成功,则给用户一个随机字符串,去访问另一个页面。
以前写session的时候,都是把session写cookie里面。
那现在我们可以把随机字符串通过返回值的方式给用户。
后端通过查看用户的url判断用户有没有token值且这个字符串是否正确也要判断。有则已登入,可以访问;没有则跳回登入页面。
用户登入
1.有些api需要用户登入才能访问,有些api不需要用户登入就能访问。
models.py
创建用户
urls.py
views.py 用户登入只有post请求
token用md5加密,并保存或更新到数据库中。
post请求,运行结果
token就保存到数据库了 需要重新检查代码
token生成成功后,就将新的token返回给用户。有异常则返回异常。API写完了。
运行结果
认证
用户所有订单app01
1.订单url
2. views.py订单视图
3.运行结果:get请求
4.这个订单只有登入成功的时候才可以看
运行结果
rest_framework认证
5.这段代码假设post请求也要认证,如果再复制一遍就会很冗余。django已经帮我们封装好了,不用自己写。
6.自定义一个认证类,自己写认证规则。
7.认证源码
8.自己定义认证规则,认证失败则返回一个异常。
9.注意:必须再写一个方法,否则还会报错。
引入该模块, 加上该方法:先为空。
查看该模块源码
加上该方法:先为空。
运行结果
用户信息app
1.假设用户信息app也要认证,(登入后才能访问)
自定义的一个认证写完了之后,app视图加上就好了。
2.如果有成千上万个api都需要认证怎么办呢
接下来全局认证:不需要每一个视图都自己加上以上代码,全局配置settings.py。
认证源码流程图:
APIView类
第一步class OrderView(APIView):点击APIView
第二步def dispatch(self, request, *args, **kwargs):
找到self.initial(request, *args, **kwargs),点击initial
第三步def initial(self, request, *args, **kwargs):
找到self.perform_authentication(request)(进行认证)
点击perform_authentication
第四步def perform_authentication(self, request):
request.user Request类
第五步同上def dispatch(self, request, *args, **kwargs):
找到request = self.initialize_request(request, *args, **kwargs)
点击initialize_request
第六步def initialize_request(self, request, *args, **kwargs):
找到return Request,点击Request
第七步class Request(object):
找到 @property def user(self):(获取认证对象,进行一步步认证)
找到return self._user
第八步还是@property def user(self):里面
找到self._authenticate()点击_authenticate
第九步def _authenticate(self): (循环所有对象,执行认证方法) Authtication自定义认证类(自己写了认证方法,就用自己的)
第十步def authenticate(self, request):
报错:(返回元祖(user对象,token对象)) class OrderView(APIView):或class AuthView(APIView):等订单
第十一步执行各个订单的def post: 或def get:等方法
源码配置
1.dispatch
2.封装Request
3.for循环认证列表
4.默认去全局的配置文件读
5.如果自己请求函数里面设置了,就用自己的。没设置就用配置文件的。
6.将认证写在配置文件中,不用局部的。
源码: api_settings表示去配置文件中读。
读REST_FRAMEWORK这个key
7.setting.py
8.将认证相关的东西都写在一个文件中。再引入该文件
settings.py
views.py:视图文件中只有视图相关的类。
9.列表里填你自己写的认证类的路径。 view.py里的所有类都不用加了,默认用session全局的认证。
10.登入不需要认证信息。全局认证,个别不需要认证。 空列表就行
11.运行结果:
订单接口:
登入接口:
订单接口:
接下来是匿名用户登陆问题
Request封装直接到:
1.读取全局认证配置
2.进行认证
3.initial > 实现认证self.perform_authentication(request)
4.user
5.获取认证对象,进行下一步步的认证
往下走
6.如果是匿名用户,默认叫什么
setting.py
views.py
urls.py
运行结果
7.源码设置默认用户名:
8.设置匿名用户名
"UNAUTHENTICATED_USER":lambda :"匿名用户" 若匿名函数没有参数,直接返回字符串
url请求
运行结果:
9.setting.py:
内置认证
1.django内置的认证 引入BaseAuthentication
BaseAuthentication源码:
2.BaseAuthentication 下有两个方法。
3.推荐继承BaseAuthentication。更规范。
接下来继续走源码: BasicAuthentication 基于浏览器认证
1.往下走,复制源码
settings.py
运行结果
3.views.py: 引入BasicAuthentication
4.运行结果
5.看源码
6.改源码,先注释一下2行代码
不注释表示允许用户为匿名用户。
7.运行结果:浏览器会对用户名和密码加密放到url上,然后发给服务端,进行验证。
8.还原代码
本章结束
rest_framework之认证源码剖析的更多相关文章
- rest_framework之权限源码剖析
权限问题 1.models.py 2.用户类型: 3.views.py: 假设订单相关业务(只有SVIP用户有权限) 假设用户信息相关业务(只有普通用户.VIP有权限) 4.运行结果: 基本使用 以上 ...
- Rest_Framework之认证、权限、频率组件源码剖析
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- 05 drf源码剖析之认证
05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...
- rest_framework之视图及源码剖析
最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...
- Django----djagorest-framwork源码剖析
restful(表者征状态转移,面向资源编程)------------------------------------------->约定 从资源的角度审视整个网络,将分布在网络中某个节点的资源 ...
- RestFramework——API基本实现及dispatch基本源码剖析
基于Django实现 在使用RestFramework之前我们先用Django自己实现以下API. API完全可以有我们基于Django自己开发,原理是给出一个接口(URL),前端向URL发送请求以获 ...
- Django Rest Framework源码剖析(八)-----视图与路由
一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...
- Django Rest Framework源码剖析(五)-----解析器
一.简介 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数 ...
- Django Rest Framework源码剖析(四)-----API版本
一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...
随机推荐
- Vagrant上运行SITL
打算给Tower加个手机遥控的功能,用运行于vagrant sitl来联合调试,在公司的网络条件很好的情况下没出任何错,都是根据http://ardupilot.org/dev/docs/settin ...
- Lesson 2-3(字符串)
2.5 字符串 --- 字符串是不可变的. >>> str = "Hello world!" >>> str[-6:-1] = "py ...
- python单元测试框架unittest总结
unittest.TestCase:TestCase类,所有测试用例类继承的基本类. class BaiduTest(unittest.TestCase): TestCase类的属性如下: setUp ...
- Mybatis面试集合(转)
Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...
- C++中的继承(2)类的默认成员
在继承关系里面, 在派生类中如果没有显示定义这六个成员函数, 编译系统则会默认合成这六个默认的成员函数. 1.构造与析构函数的调用关系 调用关系先看一段代码: class Base { public ...
- MiniGUI 如何显示繁体字
有两种编码格式都可以显示繁体字,一种是GBK,一种是BIG5: 由于MiniGUI官方提供的字库的字体大小太小,所以只得自己去做字库,我用一个字库生成软件,分别做了一个GBK编码的字库和一个BIG5编 ...
- CF1082
D 乱搞题..发现只有a[i]=1是特殊的 瞎搞一下 E 发现一段的贡献是出现次数最多的-为c个数 然后考虑分别对每种颜色做一下 然后每次只有这种颜色和他们之间是有用的 然后做个最大区间和就好了 F ...
- 杂记:Python 两坑
近日写代码又遇到两个 Python 的坑,觉得值得记录. 递归传参问题 Python 里传参的实现是 assignment,但由于 Python 里都是对象,除了几个基本类型,assignment 基 ...
- MVC中ztree异步加载
var setting = { async: { enable: true, url: "*****/LoadChild", autoParam: ["id"] ...
- 记录NPOI使用方法
DLL 下载地址:https://files.cnblogs.com/files/xujunbao/NPOI.rar using NPOI.HSSF.UserModel; using NPOI.SS. ...