一、django restframework 请求流程源码剖析

上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限、频率、版本、认证、这个四个组件都是通过相似的流程进行实现,不同的组件,是在initial()这个方法中调用不同的方法来进行执行的,同时在剖析源码的过程中,我们整个rest_framework总共分为10个组件,每一中组件都可以进行全局配置,和局部配置,下面依次介绍这10个组件。

1、认证auth()

上面流程已经提到,API认证,每一个认证类的,真正的验证是执行了一个authenticate()方法,在自定义认证类时,需要重写这个authenticate()方法即可。同时,rest——framework提供了几个认证类from rest_framework.authentication 可以通过查看提供的认证类,在自定制时,可以继承这个里面的基类。

而authenticate()方法的返回值,一共有三种,第一种,认证不通过报错。第二种认证通过返回一个元组,元组中的内容是user对象和token对象。第三种是None,默认就是匿名用户

  1. from rest_framework import exceptions
  2.  
  3. from rest_framework.authentication import BaseAuthentication
  4. from django.http import JsonResponse
  5. from app01 import models
  6. import time ,hashlib
  7.  
  8. class MyAuthtication(BaseAuthentication):
  9. '''用户api验证'''
  10.  
  11. def authenticate(self ,request):
  12. token = request.GET.get('token')
  13. token_obj = models.Token.objects.filter(token=token).first()
  14. if not token_obj:
  15. raise exceptions.AuthenticationFailed('用户认证失败')
  16. return ( token_obj.user, token_obj)
  17.  
  18. def authenticate_header(self ,request):
  19. pass
  1. from rest_framework import exceptions 关于说到的如果认证失败,需要报错,reset_framework是要返回指定报错的
  1. raise exceptions.AuthenticationFailed ,这个主动触发这个AuthenticationFailed,报错,默认超类中会抓取这个异常,response返回。

全局配置和局部配置

全局

  1. REST_FRAMEWORK =
  2. {'DEFAULT_AUTHENTICATION_CLASSES':['app01.utils.auth.MyAuthtication',],
  3. 'UNAUTHENTICATED_USER':lambda:None}
  4.  
  5. 1、在settings文件中 ,按照上述配置,认证类是可以有多个的,所以DEFAULT_AUTHENTICATION_CLASSES,这个key对应的是一个列表。
  6. app01.utils.auth是认证类的路径。
  7.  
  8. 2、关于我们说认证返回有三种结果,如果是未登录用户是,返回的信息是None,这个也可以进行定制,返回指定的信息,按照第二行配置

  

局部配置

  1. class AuthView(APIView):
  2. authentication_classes = [BasicAuthentication,]
  3.  
  4. 在视图中按照上面配置即可

  

2、权限(permission)

2.1权限的是通过 此方法进行判断的 ,在重写的时候,重写这个has_premission方法即可,当然rest_framework,提供了几个默认的权限类供使用,from rest_framework.permissions  ,通过这个permissions  文件查找几种提供的权限类,重写时可以继承。

  1. def check_permissions(self, request):
  2. """
  3. Check if the request should be permitted.
  4. Raises an appropriate exception if the request is not permitted.
  5. """
  6. for permission in self.get_permissions():
  7. if not permission.has_permission(request, self):
  8. self.permission_denied(
  9. request, message=getattr(permission, 'message', None)
  10. )
  11.  
  12. has_premission()方法 。而这方法的返回值,一种是True,带表有权限,False代表没有权限。

  

2.2全局配置和局部配置

全局配置

  1. REST_FRAMEWORK ={
  2. 'DEFAULT_PERMISSION_CLASSES':['app01.utils.auth.MyPremission']}

  

局部配置

  1. from rest_framework.permissions import BasePermission
  2.  
  3. class AuthView(APIView):
  4. permission_classes = [BasePermission,]

  

3、频率(throttle)

3.1这个组件又称之为节流,这个作用就是现实一个api,在一个固定时间段内能够访问几次 , 是调用了每一个节流类的allow_request方法进行判断的。这个可以重写也可以直接调用rest_framework提供的,从

  1. from rest_framework.throttling 获取,里面的整体实现原理是类似的。同时这个地方要注意,我们是以ip地址还是用户来识别是否是同一个用户的,如果是匿名用户就可以用ip地址,如果是登录用户可以用用户名或者用户id都可以。但是本质上,是无法真正实现这个限制访问的。
  1. def check_throttles(self, request):
  2. """
  3. Check if request should be throttled.
  4. Raises an appropriate exception if the request is throttled.
  5. """
  6. for throttle in self.get_throttles():
  7. if not throttle.allow_request(request, self):
  8. self.throttled(request, throttle.wait())  
  1. allow_request()方法返回两个结果,一个是True,代表有权限,一个是False,没有权限。

3.2全部和局部配置

全局

  1. REST_FRAMEWORK ={DEFAULT_THROTTLE_RATES':{'all':'3/m'},
  1. DEFAULT_THROTTLE_CLASSES:['app01.utils.auth.MyPremission']
  1. }
  2.  
  3. 关于这个节流的配置 ,后面的scope是说的是实际设置的默认频率,是每分钟3次的意思,可以看源码,这个单位不止分钟。 关于这个scope是需要在自定义的节流类中配置的。 一般使用这个SimpleRateThrottle就够用了 class VisitorThrottle(SimpleRateThrottle): scope = 'all' def get_cache_key(self, request, view): '''这个就是返回一个放在django缓存中的key, 可以根据用户id,或者ip地址来然后返回这个ip这个字符串, 或者用用户id''' return ip或者用户id

  

局部

  1. class AuthView(APIView):
  2. throttle_classes = []
  3.  
  4. 将自己写的自定制的类导入,放到这个列表中即可

  

4、版本(version)

4.1版本认证是通过这个方法实现的

  1. def determine_version(self, request, *args, **kwargs):
  2. """
  3. If versioning is being used, then determine any API version for the
  4. incoming request. Returns a two-tuple of (version, versioning_scheme)
  5. """
  6. if self.versioning_class is None:
  7. return (None, None)
  8. scheme = self.versioning_class() #去配置中版本类,实例化
  9. return (scheme.determine_version(request, *args, **kwargs), scheme)
  10. #返回这个实例的determine_version()方法的调用结果 ,和这个实例
  11.  
  12. 这个determine_version() 方法只有两种返回结果,一个是返回版本信息,一个报异常。

  

4.2 全局配置与局部配置

全局配置

关于版本的认证,完全不可用rest_framework提供的版本认证的类进行一个全局配置 ,可以通过from rest_framework.versioning,获取

  1. def determine_version(self, request, *args, **kwargs):
  2. version = kwargs.get(self.version_param, self.default_version)
  3. if version is None:
  4. version = self.default_version
  5.  
  6. 1、这个是获取版本的源码,可以看到他是从URL中获取一个参数,这个参数,设置的是version_param ,所以,这个地方设置的是什么参数,URL上就要默认的别名要与这个参数一致,,例如:
  7.  
  8. url('api/(?P<version>v1+)/order$' ,views.OrderView.as_view() ,name='uuu')
  9.  
  10. REST_FRAMEWORK ={ 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning' ,
  11. 'VERSION_PARAM':'version',
  12. 'ALLOWED_VERSIONS':['v1' ,'v2']
  13. }
  14.  
  15. 2、我们看到还有一个ALLOWED_VERSIONS这个参数,这个参数是默认当前有多少个个版本号,加入说我们只有两个版本,但是URL中去是一个v100,不在这个范围内,也会报错。

  

5、解析器

5.1、 作用,用来解析发送的post请求中的请求体的数据,当post请求头中ContentType不在是x-www-form-urlencode 和请求体的数据格式是 name=eric&age=26 时, 通过request.POST是拿不到请求体中的数据的。

同时,我们的ContentType,可以决定,发送post请求时,post请求体中的数格格式。而在MVC这种前后端分离的结构中,数据都是通过json进行传输的。

所以,请求头中的ContentType 就会变成application/json 格式,这个时候请求体中的数据格式也发生变化,可以是{"name":"eric","age":18},这里面有一个细节 就是一定是双引号,不然restframework,内部的loads反序列化不了会报错。

2、解析器源码剖析流程

6、序列化(serialize)

序列化主要有两方面功能,第一是序列化,第二个就是数据验证,其实序列化,和django本身的form和ModelForm非常相似

6.1 序列化源码流程

6.2验证源码流程

7、分页(pagination)

8、视图(view)

9、路由

10、渲染器

django restframework的更多相关文章

  1. django restframework serializer 增加自定义字段

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...

  2. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  3. django restframework 快速入门

    django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...

  4. Django Restframework 实践(一)

    具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...

  5. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  6. django restframework 的日常使用

    本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...

  7. Django RestFramework (DRF)

    准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...

  8. 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架

    一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...

  9. python Django rest-framework 创建序列化工程步骤

    11创建项目 2创建应用 3stting添加应用(apps)-添加制定数据库-修改显示汉字(zh-hans)-上海时区(Asia/Shanghai) 4主路由添加子路由 5应用里创建子路由 6创建数据 ...

随机推荐

  1. flask学习(一)

    特点: 短小精悍,可扩展性强 依赖wsgi:werkzurg werkzurg示例: from werkzeug.wrappers import Request, Response from werk ...

  2. spring security 学习笔记

    官方文档

  3. First Unique Character in a String

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...

  4. Gitlab_ansible_jenkins三剑客③Ansible的安装及使用

    一台服务器可能会安装不同的python应用,不同的应用可能使用的模块版本不同,如果都安装在同样的环境下容易冲突,为了避免冲突,引入virtualenv 这个包管理工具进行环境的隔离 使用pip安装之前 ...

  5. cxf webservice请求https

    本地java请求https接口,不需要添加证书: 只需要修改配置文件applicationContext-soap-client.xml: <beans xmlns="http://w ...

  6. 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题

    今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...

  7. 为什么要使用getters和setters/访问器?

    Why use getters and setters/accessors? 实际上会有很多人问这个问题....尤其是它成为Coding Style中一部分的时候. 文章出自LBushkin的回答 T ...

  8. web页面和小程序页面实现瀑布流效果

    小程序实现瀑布流效果,和web页面差不多,都要经过以下步骤: 1).加载图片,获取图片的宽高度: 2).根据页面需要显示几列计算每列的宽度: 3).根据图片真实宽度和每列的宽度比,计算出图片需要显示的 ...

  9. 2018-2019-2 20165239 《网络对抗技术》Kali的安装 第一周

    2018-2019-<网络对抗技术> Kali安装 20165239其米仁增 一.资源下载以及工具安装 1.下载虚拟机工具VMware. 下载链接 :https://www.baidu.c ...

  10. jquery的选择器——[作为学习备用]

    1,转载:https://www.cnblogs.com/onlys/articles/jQuery.html jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $(&quo ...