zoukankan      html  css  js  c++  java
  • Django Rest Framework 请求流程

     

    用户请求到django,首先经过wsgi,中间件,然后到url路由系统,执行视图类中继承APIView执行as_view方法,在源码中可以看到VPIView继承了django的View类,通过super执行View中的as_view方法详细看文章,最终返回执行self.dispatch(),按照django类中查找顺序现从自己的方法中找,如果自己没有dispatch方法再从继承的父类中找,
    从APIView中找dispatch方法,
    在dispatch中首先将request执行self.initialze_request重新封装request,
    之后执行self.initial方法,这个方法一共执行4步操作:
    1. 首先对request版本进行验证;

    版本控制执行自己类中的determine_version方法,最终是versioning_class的属性,可以通过在settings.py文件中进行配置

    2. 第二步进行用户认证

    执行perform_authentication方法,在这个方法中执行了request.user方法,按照python类查找顺序先到APIView中进行查找,没有网View中查找都没有,往回看重新看一下之前的request封装操作,
    
    查到restframework.request中有个Request类重新封装request,在Request中查找user方法,最后找到request.user最后返回authentication_classes实例化并返回认证列表

    3. 第三步进行权限控制

    复制代码
    执行check_permissions方法,按照上面的执行的流程,最后返回permission_classes实例化并返回权限列表,然后循环实例化对象中has_permission(必须存在)方法进行判断,如果定义了权限类,
    
    has_permission必须有返回值,可以返回布尔值或raise一个报错信息,True表示有权限不做操作,False没有权限执行permission_denied方法,首先进行判断是否进行认证,如果没有认证则raise一个没有认证错误信息,
    
    如果有认证则raise一个没有权限错误信息。
    复制代码

    4. 第四步进行用户访问频率限制

    复制代码
    执行check_throttles方法,按照上面的执行的流程,最后返回throttle_classes实例化并节流列表,循环执行allow_request方法,源码中如果没有定义allow_request方法则restframework会返回raise错误必须重写allow_request方法,
    
    重写allow_request,比如对匿名用户访问做限制1分钟只能访问10次超过10次休息1分钟返回false不让访问,执行到wait(必须定义)进行重写,将访问时间进行计算然后返回下次访问时间,
    
    也可以继承restframework已经写好的类SimpleRateThrottle,AnonRateThrottle,UserRateThrottle,ScopedRateThrottle
    复制代码
     
     
     
  • 相关阅读:
    简道云--编辑应用入门
    虚拟机迁移
    KVM虚拟化网络管理(一)
    keepalived概述
    kvm虚拟化存储管理
    免密登录gitlab
    KVM虚拟化介绍
    Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站
    Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站
    Jenkins凭证介绍
  • 原文地址:https://www.cnblogs.com/niuli1987/p/10275194.html
Copyright © 2011-2022 走看看