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.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123
POST /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 )就用到了 解析器-->
视图处理数据,用到了序列化(对数据进行序列化或验证) -->
视图返回数据可以用到分页
Django_rest framework 框架介绍的更多相关文章
- Django REST framework框架介绍和基本使用
Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...
- .NET Framework框架介绍
1.内容 .net framework c#和.net关系 掌握C#中命名空间2..net 就是微软提供的一个开发平台 版本: vs2008 3.5 vs2010 4.0 vs2012 2013 20 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-1.通讯框架介绍
[连载]<C#通讯(串口和网络)框架的设计与实现>- 0.前言 目 录 第一章 通讯框架介绍... 2 1.1 通讯的本质... 2 1 ...
- UiAutomator自动化测试框架介绍
UiAutomator自动化测试框架介绍 环境搭建 1 必要条件 1.1 JDK 1.2 SDK(API高于15) 1.3 Eclipse 2 ...
- Swift - 访问通讯录-使用AddressBook.framework和AddressBookUI.framework框架实现
1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...
- Git.Framework 框架随手记--ORM编辑删除
前面一篇文章<Git.Framework 框架随手记--ORM新增操作>主要讲解了如何使用Git.Framework往数据库中添加数据.其操作过程相对简单,本章主要记录如何编辑数据和修改数 ...
- Git.Framework 框架随手记--ORM项目工程
前面已经简单介绍过了该框架(不一定是框架),本文开始重点记录其使用过程.可能记录的内容不是太详尽,框架也可能非常烂,但是里面的代码句句是实战项目所得.本文非教唆之类的文章,也非批判之类的文章,更不是炫 ...
- IOS-AssetsLibrary(相册)框架介绍
AssetsLibrary框架介绍: AssetsLibrary框架包含了ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRep ...
- Core Foundation框架介绍
Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...
随机推荐
- docker(3)容器管理命令
接着上一篇,今天说一下Docker 有关容器的常用命令.算是比较详细了吧. docker run 命令: 注:此命令作用是使用一个镜像运行启动一个容器. 在启动运行的时候 会检查docker 中是否 ...
- EasyUI 使用tabs切换后datagrid显示不了内容
今天刚遇到这个问题,找了下各群的深度合作伙伴,没有好的答案,那就自己研究吧. 问题点在于打开tab1时,快速切到tab2,这时tab1的datagrid渲染未完成,再次回到tab1,因为是在不可见区域 ...
- Spring Boot 整合 rabbitmq
一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...
- NLog组件
接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知: 下载 通过Nu ...
- flex 输入框布局
1:创建一个弹性容器(display:flex) 2:构建2个或3个弹性项目. 3:把弹性项目设置为居中对齐.(align-items:center) 4:改变input自身对齐方式,把它设置为拉伸以 ...
- Dynamics 365中显示格式为URL的字段极少部分URL值录入了不显示怎么回事?
微软动态CRM专家罗勇 ,回复318或者20190315可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 对于如下类型的字段, ...
- SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现
SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现 笔者所在的项目上的公司间STO的流程里,发货公司在做PGI之后系统自动触发收货公司的内向交货单.这个功能是通过交货单的Outp ...
- Android中的线程池
在Android中,主线程不能执行耗时的操作,否则可能会导致ANR.那么,耗时操作应该在其它线程中执行.线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象.这个时候 ...
- event 和delegate的分别
突然想起delegate委托是支持+= 和-=操作的,然后研究一下究竟这个是怎么做到的,好模仿一下.一开始以为是+=的运算符重载,但是在类库参考中并没有这个运算符重载,只有!= 和==运算符重载.有点 ...
- C#图片添加文字水印
/// <summary> /// 给图片添加文字水印 /// </summary> /// <param name="img">图片</ ...