如果我们写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之认证源码剖析的更多相关文章

  1. rest_framework之权限源码剖析

    权限问题 1.models.py 2.用户类型: 3.views.py: 假设订单相关业务(只有SVIP用户有权限) 假设用户信息相关业务(只有普通用户.VIP有权限) 4.运行结果: 基本使用 以上 ...

  2. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  3. 05 drf源码剖析之认证

    05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...

  4. rest_framework之视图及源码剖析

    最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...

  5. Django----djagorest-framwork源码剖析

    restful(表者征状态转移,面向资源编程)------------------------------------------->约定 从资源的角度审视整个网络,将分布在网络中某个节点的资源 ...

  6. RestFramework——API基本实现及dispatch基本源码剖析

    基于Django实现 在使用RestFramework之前我们先用Django自己实现以下API. API完全可以有我们基于Django自己开发,原理是给出一个接口(URL),前端向URL发送请求以获 ...

  7. Django Rest Framework源码剖析(八)-----视图与路由

    一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...

  8. Django Rest Framework源码剖析(五)-----解析器

    一.简介 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数 ...

  9. Django Rest Framework源码剖析(四)-----API版本

    一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...

随机推荐

  1. JVM中的方法分派

    解析调用是一个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用,不会延迟到运行期再去完成.而分派调用则可能是静态的也可能是动态的,根据分派依据的宗量数 ...

  2. Vue-计算属性和侦听属性

    复杂逻辑应使用计算属性而不应写在插值表达式{{ }}里 <div id="app"> 原值:{{ msg }} <br> 翻转后的值:{{ reverseM ...

  3. Node 环境变量 process.env.NODE_ENV 之webpack应用

    转载来源:https://github.com/wfzong/NODE_ENV_TEST,这里还有源码可以学习,谢谢原作者的分享! 对于process.env.NODE_ENV困惑起因为在配置webp ...

  4. c#解决浏览器跨域问题

    1.浏览器为什么不能跨域? 浏览器有一个基本的安全策略--同源策略.为保证用户的信息安全,它对不同源的文档或脚本对当前文档的读写操作做了限制.域名,子域名,端口号或协议不同都属于不同源,当脚本被认为是 ...

  5. c#操作Excel模板,替换命名单元格或关键字形成报表

    c#操作Excel模板,替换命名单元格或关键字形成报表 http://blog.sina.com.cn/s/blog_45eaa01a0102vqma.html一 建立Excel 模板文件 templ ...

  6. Linux从入门到入门

    一. 前言 首先,在你的Windows系统上要想有linux系统,那就必须先安装一款软件,这里提供的是14.15的,还有ISO镜像:VMware-workstation 安装VMware:略 新建虚拟 ...

  7. 八 ip和子网详解

    IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255  B类IP段 128.0.0.0 到191.255. ...

  8. jQuery-委托事件和on方法注册事件

    delegate注册委托事件 delegate--代理.委托 事件代理----事件最终不是由$("#first")执行,它只是代理元素 第一个参数:最终发生事件的元素 第二个参数: ...

  9. Eclipse如何将java项目改为web项目

    用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行,那我们就要将它转换为web项目. 方法: 1.右击项目项目-属性(p ...

  10. UI---设置Activity背景为透明

    1.在values下colors中设置透明颜色 <?xml version="1.0" encoding="utf-8"?> <resourc ...