zoukankan      html  css  js  c++  java
  • Django_rest framework 框架介绍

    restful介绍 

    restful协议

      一切皆是资源,操作只是请求方式

    URL 设计 

    原先的URL设计方式 

    在url 中体现出操作行为

        /books/ books
        /books/add/ addbook
        /books/(d+)/change/ changebook
        /books/(d+)/delete/ delbook

    restful 风格的URL 设计

    不在url中体现操作行为,在视图函数区分,(提交,查看)

    对于需要令传入参数的url 在做区分 (编辑,删除)

        /books/ -----get books ----- 返回当前所有数据
        /books/ -----post books ----- 返回提交数据 
    
        /books/(d+)-----get bookdetail ----- 返回当前查看的单条数据 
        /books/(d+)-----put bookdetail ----- 返回更新数据 
        /books/(d+)-----delete bookdetail ----- 返回空
    

    resful 协议规范

    1 根据method 不同,进行不同的操作

    即 URL 设计区别

    原来都是在 url 中设置。这样可以大大减少 url 的数量

    GET / POST / PUT / DELETE / PATCH

    2 面向资源编程

    视 URL 为资源

    http://www.yangtuo.com

    3 体现版本

    http://v1.yangtuo.com
    http://v2.yangtuo.com

    4 体现是 API

    不仅仅局限于 URL 中,也可以通过请求头之类的其他方法进行加入版本字段

    http://api.yangtuo.com
    http://yangtuo.com/api/salary    

    5 建议使用 https 更安全

    https://www.yangtuo.com    

    6 响应式设置状态码

    core: 200 300 400 500 
    return HttpResponse("text_data",status=300)    

    常见状态码

    OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    NO CONTENT - [DELETE]:用户删除数据成功。
    INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

    7 过滤条件

    http://yangtuo.com/v2/api/salary?page=1&size=10    

    8 返回值

    不同视图都要返回具有标识意义的返回值

    http://yangtuo.com/v2/api/salary
          

    GET: 返回所有的列表         
      [{
    "id":1,"title":"lala"},         
      {
    "id":2,"title":"wawa"},         
      {
    "id":3,"title":"kaka"},]       
    POST: 返回新增的数据         
      {
    "id":1,"title":"tuotuo"}       
    PUT: 更新全部的数据 返回更新数据       
    PATCH: 更新少量数据 返回更新数据       
    DELETE: 删除数据 返回空

    9 返回错误处理信息

    如果存在异常要基于错误码返回错误信息

    {
      code:10000,   error:"xxx错了"
    }

    10 Hypermedia API

    返回信息的时候加上 api ,即返回的数据最好加上 URL 信息这样方便下面操作 

    {"link": {
      "rel":   "collection https://www.example.com/zoos",
      "href":  "https://api.example.com/zoos",
      "title": "List of zoos",
      "type":  "application/vnd.yourformat+json"
    }}

    ps:

      记忆方式

    URL 5个 
      https(推荐用https)://v2(版本)/yangtuo.com(域名为资源)/api(体现api)/salary?page=1&size=10(有条件)
        
    请求 1 个    
      根据method 不同,进行不同的操作
    
    返回 4个
      返回值 响应式设置状态码 返回错误信息 返回信息的时候加上api

    rest framework 框架

    存在意义: 

      帮助我们快速开发基于 restful 规范的接口 

    核心组件介绍

    - 路由

      - 可以通过as_view传参数,根据请求方式不同执行相应的方法

      - 可以在url中设置一个结尾,类似于: .json

    - 视图

      - 帮助开发者提供了一些类,并在类中提供了多个方法以供我们使用。

    - 版本

      - 在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同做不同处理

    - 认证

      - 写一个类并注册到认证类,在类的的authticate方法中编写认证逻辑。

        - 认证成功(user,auth)

        - raise AuthticateFaild(....)

        - None

    - 权限

      - 写一个类并注册到权限类,在类的的has_permission方法中编写认证逻辑。
        - True 

        - False

    - 频率限制

      - 写一个类并注册到频率类,在类的的 allow_request/wait 方法中编写认证逻辑。

      allow_request

        - True

        - False 如果返回False,那么就要执行wait

    - 解析器

      - 根据ContentType请求头,选择不同解析器对 请求体中的数据进行解析。

    POST /index/ http1.1.
    host:11.11.11.11
    Content-Type:url-formendo.... 
    
    user=alex&age=123
    POST /index/ http1.1.
    host:11.11.11.11
    Content-Type:application/json
    
    {....}

    - 分页 

      - 对从数据库中获取到的数据进行分页处理: SQL -> limit offset

         - 根据页码

    http://www.luffycity.com/api/v1/student/?page=1&size=10

        - 根据索引

    http://www.luffycity.com/api/v1/student/?offset=60&limit=10

        - 根据加密

    http://www.luffycity.com/api/v1/student/?page=erd6ops5

    - 序列化

      - 对queryset序列化以及对请求数据格式校验。

    - 渲染器

      - 根据URL中传入的后缀,决定在数据如何渲染到到页面上。

    - 响应器

      - 基于序列化组件完成序列化后的 data 进行 Response

    ps:

    页码越大速度越慢,为什么以及如何解决?
    
      原因:
    
        页码越大向后需要扫描的行数越多,因为每次都是从0开始扫描。
      解决:
        - 限制显示的页数
    
        - 记录当前页数据ID最大值和最小值,再次分页时,根据ID现行筛选,然后再分页。

     源码流程图 

    于原生的 View 对比

    • 重写了 dispatch 方法 
    • 重构了一个 request 
      • 原生的 request 可以用 request._request 调出来 
    • 新增了 系列的方法和数据
    • 新增数据 request.data 用于取 post 数据
    • View方式 对于 非urlencoded 的数据是无法解析序列化成字典的
    • APIView方式 request.data 可以做到自动序列化并解析成字典
    • 覆盖原生的 get 数据请求方式
      • request.get APIView方式 获取get 数据
      • request._request.get View方式获取get 数据

    django rest framework生命周期

    发送请求-->
    Django的wsgi-->
    中间件-->
    路由系统_执行CBV的as_view(),就是执行内部的dispath方法-->
    在执行dispath之前,有版本分析 和 渲染器-->
    在dispath内,对request封装-->
    版本-->
    认证-->
    权限-->
    限流-->
    视图-->
    如果视图用到缓存( request.data or   request.query_params )就用到了 解析器-->
    视图处理数据,用到了序列化(对数据进行序列化或验证) -->
    视图返回数据可以用到分页
  • 相关阅读:
    Git提交错了不用慌,这三招帮你修改记录
    codeforces 1443D,解法简单,思维缜密的动态规划问题
    为什么优秀的人总是少数?我从天文学当中获得了一些启示
    本科入行可能吗?做到这3点,斩获BAT offer不是梦
    裸考了一次雅思,我居然学会了数据分析!
    有了Git这个功能,再也不需要依赖IDE了!
    职场中究竟什么是ownership,你是一个有ownership的人吗?
    为何跳槽不考虑腾讯?聊聊我和鹅厂的一点往事
    【Azure DevOps系列】Azure DevOps EFCore命令式脚本部署到SQL数据库
    Linux查看、开启、关闭防火墙操作
  • 原文地址:https://www.cnblogs.com/shijieli/p/10272711.html
Copyright © 2011-2022 走看看