django rest framework drf 知识点大汇合 共5大模块 (第一期)

整个博客系列:

  • Web利用前后端拆散构造
  • Web API接口设计的RESTful格调
  • Django REST framework框架

残缺笔记自取:

残缺笔记间接在这自取

https://pan.baidu.com/s/1fgLF...

目录:

本期解说正式开始

引入Django REST framework

在本章中,咱们要大家介绍为什么学习Django REST framework,它能帮忙咱们做哪些事件。

课 程思路

咱们从剖析当初风行的前后端拆散Web利用模式说起,而后介绍如何设计REST API,通过应用Django来实现一个REST API为例,明确后端开发REST
API要做的最外围工作,而后介绍Django REST framework能帮忙咱们简化开发REST API的工作。

Web利用模式

在开发Web利用中,有两种利用模式:

  • 前后端不拆散
  • 前后端拆散

1 前后端不拆散

在前后端不拆散的利用模式中,前端页面看到的成果都是由后端管制,由后端渲染页面或重定向,也就是后端须要管制前端的展现,前端与后端的耦合度很高。

这种利用模式比拟适宜纯网页利用,然而当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据自身,所以后端本来返回网页的接口不再实用于前端App利用,为了对接App后端还需再开发一套接口。

2 前后端拆散

在前后端拆散的利用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再管制前端的成果。至于前端用户看到什么成果,从后端申请的数据如何加载到前端中,都由前端本人决定,网页有网页的解决形式,App有App的解决形式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。

在前后端拆散的利用模式中 ,前端与后端的耦合度绝对较低。

在前后端拆散的利用模式中,咱们通常将后端开发的每个视图都称为一个 接 口,或者 API ,前端通过拜访接口来对数据进行增删改查。

____

意识RESTful

在 前后端拆散的利用模式里,后端API接口如何定义?

例如对于后端数据库中保留了商品的信息,前端可能须要对商品数据进行增删改查,那相应的每个操作后端都须要提供一个API接口:

1. POST /add-goods 减少商品2. POST /delete-goods 删除商品3. POST /update-goods 批改商品4. GET /get-goods 查问商品信息

对于接口的申请形式与门路,每个后端开发人员可能都有本人的定义形式,格调迥异。

是否存在一种对立的定义形式,被宽广开发人员承受认可的形式呢?

这就是被广泛采纳的API的RESTful设计格调。

RESTful设计办法

1. 域名

应该尽量将API部署在专用域名之下。

https://api.example.com

如果确定API很简略,不会有进一步扩大,能够思考放在主域名下。

https://example.org/api/

2. 版本(Versioning)

应该将API的版本号放入URL。

http://www.example.com/api/1.0/foohttp://www.example.com/api/1.1/foohttp://www.example.com/ap、/2.0/foo

另一种做法是,将版本号放在HTTP头信息中,但不如放入URL不便和直观。[Github](https://developer.github.com/...
specific-version)采纳这种做法。

因为不同的版本,能够了解成同一种资源的不同表现形式,所以应该采纳同一个URL。版本号能够在HTTP申请头信息的Accept字段中进行辨别(参见[Versioning
REST Services](http://www.informit.com/artic...)):

Accept: vnd.example-com.foo+json; version=1.0Accept: vnd.example-com.foo+json; version=1.1Accept: vnd.example-com.foo+json; version=2.0

3. 门路(Endpoint)

门路又称"起点"(endpoint),示意API的具体网址,每个网址代表一种资源(resource)

(1) 资源作为网址,只能有名词,不能有动词,而且所用的名词往往与数据库的表名对应。

举例来说,以下是不好的例子:

/getProducts/listOrders/retreiveClientByOrder?orderId=1

对于一个简洁构造,你应该始终用名词。 此外,利用的HTTP办法能够拆散网址中的资源名称的操作。

GET /products :将返回所有产品清单POST /products :将产品新建到汇合GET /products/4 :将获取产品 4PATCH(或)PUT /products/4 :将更新产品 4

(2) API 中的名词应该应用复数。无论子资源或者所有资源。

举例来说,获取产品的API能够这样定义

获取单个产品:http://127.0.0.1:8080/AppName/rest/products/1获取所有产品: http://127.0.0.1:8080/AppName/rest/products

3. HTTP动词

对于资源的具体操作类型,由HTTP动词示意。

罕用的HTTP动词有上面四个(括号里是对应的SQL命令)。

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供扭转后的残缺资源)。
  • DELETE(DELETE):从服务器删除资源。

还有三个不罕用的HTTP动词。

  • PATCH(UPDATE):在服务器更新(更新)资源(客户端提供扭转的属性)。
  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,对于资源的哪些属性是客户端能够扭转的。

上面是一些例子。

GET /zoos:列出所有动物园POST /zoos:新建一个动物园(上传文件)GET /zoos/ID:获取某个指定动物园的信息PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全副信息)PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的局部信息)DELETE /zoos/ID:删除某个动物园GET /zoos/ID/animals:列出某个指定动物园的所有动物DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

4. 过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回后果。

上面是一些常见的参数。

?limit=10:指定返回记录的数量?offset=10:指定返回记录的开始地位。?page=2&per_page=100:指定第几页,以及每页的记录数。?sortby=name&order=asc:指定返回后果依照哪个属性排序,以及排序程序。?animal_type_id=1:指定筛选条件

参数的设计容许存在冗余,即容许API门路和URL参数偶然有反复。比方,GET /zoos/ID/animals 与 GET
/animals?zoo_id=ID 的含意是雷同的。

6. 状态码(Status Codes)

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

  • 200 OK - [GET]:服务器胜利返回用户申请的数据
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或批改数据胜利。
  • 202 Accepted - [*]:示意一个申请曾经进入后盾排队(异步工作)
  • 204 NO CONTENT - [DELETE]:用户删除数据胜利。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户收回的申请有谬误,服务器没有进行新建或批改数据的操作
  • 401 Unauthorized - [*]:示意用户没有权限(令牌、用户名、明码谬误)。
  • 403 Forbidden - [*] 示意用户失去受权(与401谬误绝对),然而拜访是被禁止的。
  • 404 NOT FOUND - [*]:用户收回的申请针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  • 406 Not Acceptable - [GET]:用户申请的格局不可得(比方用户申请JSON格局,然而只有XML格局)。
  • 410 Gone -[GET]:用户申请的资源被永恒删除,且不会再失去的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 当创立一个对象时,产生一个验证谬误。
  • 500 INTERNAL SERVER ERROR - [*]:服务器产生谬误,用户将无奈判断收回的申请是否胜利。

状态码的齐全列表参见这里或这里。

7. 错误处理(Error handling)

如果状态码是4xx,服务器就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

{    error: "Invalid API key"}

8. 返回后果

针对不同操作,服务器向用户返回的后果应该合乎以下标准。

  • GET /collection:返回资源对象的列表(数组)
  • GET /collection/resource:返回单个资源对象
  • POST /collection:返回新生成的资源对象
  • PUT /collection/resource:返回残缺的资源对象
  • PATCH /collection/resource:返回残缺的资源对象
  • DELETE /collection/resource:返回一个空文档

9. 超媒体(Hypermedia API)

RESTful API最好做到Hypermedia(即返回后果中提供链接,连向其余API办法),使得用户不查文档,也晓得下一步应该做什么。

比方,Github的API就是这种设计,拜访api.github.com会失去一个所有可用API的网址列表。

{"current_user_url": "https://api.github.com/user","authorizations_url": "https://api.github.com/authorizations",// ...}

从下面能够看到,如果想获取以后用户的信息,应该去拜访api.github.com/user,而后就失去了上面后果。

{  "message": "Requires authentication",  "documentation_url": "https://developer.github.com/v3"}

下面代码示意,服务器给出了提示信息,以及文档的网址。

10. 其余

服务器返回的数据格式,应该尽量应用JSON,防止应用XML。

____

本期到此为止,敬请期待下一期,喜爱的同学们点个赞谢谢