共计 4434 个字符,预计需要花费 12 分钟才能阅读完成。
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。
____
本期到此为止,敬请期待下一期,喜爱的同学们点个赞谢谢