博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django_rest framework 框架介绍
阅读量:6292 次
发布时间:2019-06-22

本文共 4248 字,大约阅读时间需要 14 分钟。

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.comhttp://v2.yangtuo.com

4 体现是 API

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

http://api.yangtuo.comhttp://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.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....}

- 分页 

  - 对从数据库中获取到的数据进行分页处理: 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 )就用到了 解析器-->视图处理数据,用到了序列化(对数据进行序列化或验证) -->视图返回数据可以用到分页

 

转载于:https://www.cnblogs.com/shijieli/p/10272711.html

你可能感兴趣的文章
PHP监控linux服务器负载
查看>>
delphi 入门教程
查看>>
技术人员,你拿什么拯救你的生活----温水煮青蛙
查看>>
最小排列数
查看>>
[C] zintrin.h: 智能引入intrinsic函数 V1.01版。改进对Mac OS X的支持,增加INTRIN_WORDSIZE宏...
查看>>
uva 101 The Blocks Problem
查看>>
Linux终端中设置vi编辑命令
查看>>
setup vaio winxp
查看>>
EBS FORM(10g)开发步骤
查看>>
Java 旋转数组查找旋转点和任意元素(元素可重复)
查看>>
悲观锁和乐观锁详解
查看>>
KV数据存储:持久化
查看>>
Data Structures with C++ Using STL Chapter 3算法概述---笔记
查看>>
VS2010 ,工程文件减肥
查看>>
国外程序员收集整理的PHP资源大全
查看>>
C#对图片文件的压缩、裁剪操作初探
查看>>
linux磁盘满时,如何定位并删除文件
查看>>
IOS 面试 --- 动画 block
查看>>
二叉树路径和
查看>>
图像处理之霍夫变换(直线检測算法)
查看>>