乐趣区

关于django:django-rest-framework-drf-知识点大集合-共5大模块-第一期

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/foo

http://www.example.com/api/1.1/foo

http://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.0

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

Accept: 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:将获取产品 4
PATCH(或)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。

____

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

退出移动版