RESTful api 与 Django的 restfulframework


1 restful api 的基本概念

一类的资源使用一个url,不同的操作通过 请求方式处理

api -- >> 就是一个url

两个用途:

    为别人提供服务(发送邮件或者是发短信, 运营商提供接口, 客户通过api提交数据)

    前后端分离
越来越火(原来是后端通过模板引擎实现)

restful(资源状态转移--它一种约定)

-- >> 对互联网上任意东西(url) 都视为资源 -- 面向资源编程

Re
资源(***) --- 每一个url,代表资源,网络上的具体信息 S(State)
表现层 ---- 客户端与服务器之间,传递这种资源的某种表现层 T(Transfer)
状态转换 ---- POST/GET/PUT/DELETE 对服务器资源进行操作,实现转换

restful api是 实现 前后端分离的最佳实践

请求一个url的方式遵循:
GET
POST
PUT
DELETE

1 轻量,直接通过http,不需要额外的协议,post/get/delete

2 面向资源,一目了然,具有自解释性

3 数据描述简单,一般是 json,或者 xml 进行数据通信

前后端分离的优点与缺点

优点

pc,app,pad 多端适应
SPA (single page) 开始流行
前后端开发 职责不分(解决template 由谁来写的问题)
提高开发效率,前后不用再互相等待
降低模板语言耦合性 (不再用模板语言)

缺点

前后端学习 门槛增加
文档(后端给前端--文档)
前端工作量增加
SEO
后端开发去、模式迁移增加成本

2 restful api 设计规范:

协议
API与用户的通信协议,总是使用HTTPs协议。 域名
https://api.example.com 尽量将API部署在专用域名(会存在跨域问题)
https://example.org/api/ API很简单 版本
URL,如:https://api.example.com/v1/ 请求头
跨域时,引发发送多次请求 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees method GET :从服务器取出资源(一项或多项)
POST :在服务器新建一个资源
PUT :在服务器更新资源(客户端提供改变后的完整资源)
PATCH :在服务器更新资源(客户端提供改变的属性)
DELETE :从服务器删除资源 过滤,通过在url上传参的形式传递搜索条件 https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件 状态码 错误处理,状态码是4xx时,应返回错误信息,error当做key。 {
error: "Invalid API key"
} 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。 GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档 Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。 {"link": {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}}
  摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

REST 的设计原则

	统一接口  Uniform interface

	无状态  Stateless

	可缓存  Cacheable

	服务端 客户端分离  Client-Server

	分层系统  Layered System

	按需编码  Code on command

3 CBV 模型:

基于类视图与基于函数的视图

django的 cbv(class base view) 和 fbv(function base view)

cbv 是django 官方推荐的方式, 代码重用性好

功能实现方法

    通过dispatch 方法 ,反射 request中 method 的 对应值,获得相应的方法
路由
CView.as_view() == >> 返回 view 函数 | 调用dispatch(返回相应的response对象) CBV ---- 基于反射实现 根据不同的请求方式 执行不同的方法

在请求前后 加上一段功能,多个类继承 基类

class MyBaseView(object):
def dispatch(self, request, *args, **kwargs):
print('before')
ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
print('after')
return ret class LoginView(MyBaseView,APIView): def get(self,request,*args,**kwargs): ret = {
'code':1000,
'data':'老sdas'
}
response = JsonResponse(ret)
return response

4 Django Restful framework:

基于 django 开发 的用于 RESTful api 接口的 框架;

(1)安装:

依赖 django

 (1)pip install djangorestframework

	 需要安装django -- 可以使用豆瓣镜像 加速
pip install -i https://pypi.douban.com/simple/ django (2)pip install markdown django-filter
两个包一起安装

(2) DRF中的 request 与 django的 request的区别

DRF 的 request 对 django 的 request 进行了更一步的封装

(1)通过 dispatch 添加 内容
parser
autheticators # 获取认证相关的所有类,并实例化,传入request对象(user,auth)
negotator
parse_context 可以把认证类,写在配置文件中 --- 全局配置 也可以视图中 定义 --- 视图配置
authentication_classes =[] 来取消认证 REST_FRAMEWORK = {
'UNAUTHENTICATED_USER':None,
'UNAUTHENTICATED_TOKEN':None,
'DEFAULT_AUTHENTICATION_CLASSES':[
'goods.utils.MyAuthentication'
]
} (2)执行 initialize 方法 处理版本
认证 auth
权限 permission
访问频率限制 throttle (3) 通过 反射 执行相应的 方法 (4)response 加工 ,返回结果

最新文章

  1. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。
  2. UIDynamic--动力元素行为:UIDynamicItemBehavior
  3. VS 2015 localhost访问有效 改用 IP访问 400错误 invalid hostname 修改方法
  4. Linux Shell多命令执行
  5. hibernate base
  6. JSON解析总结2
  7. python 自动化之路 day 09 进程、线程、协程篇
  8. 像table一样布局div的CSS属性详解
  9. NOI2012 Day2
  10. Codeforces 328B-Sheldon and Ice Pieces(馋)
  11. JS字符串和数组常用方法
  12. RunLoop总结:RunLoop的应用场景(四)
  13. Collection 和 Collections 、 Array 与 Arrays 的区别
  14. C# 日志记录分级功能使用 按照日期,大小,或是单文件存储
  15. 微软被传证实收购 GitHub
  16. Oracle 同步
  17. eclipse Specified VM install not found: type Standard VM, name
  18. change color3
  19. Sql Server 与 MySql 在使用 update inner join 时的区别
  20. [转]什么是 RPC?

热门文章

  1. 简明python教程五----数据结构(下)
  2. 正则表达式 - JavaScript描述
  3. linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值
  4. 使用githubs托管代码
  5. C#转义字符(好记性不如烂笔头)
  6. 日志体系——loging
  7. LVS基本介绍
  8. nginx2
  9. 使用Linq to XML 修改app.config
  10. Mspec