当前位置: 首页 > 后端技术 > Python

djangorestframeworkdrf知识点大合集,共5个模块(第一期)

时间:2023-03-25 22:02:15 Python

djangorestframeworkdrf知识点大合集,共5个模块(第一期)整个博客系列:Web应用前端分离结构WebAPI接口设计的RESTful风格的DjangoRESTframework框架完整的笔记自取:完整的笔记直接取在这里https://pan.baidu.com/s/1fgLF...目录:介绍DjangoRESTframework在本章正式开始,我们想给大家介绍一下为什么要学习DjangoRESTframework以及它可以帮助我们做什么。课程思路:我们从分析当下流行的前后端分离Web应用模式入手,然后介绍如何设计一个RESTAPI。以使用Django实现一个RESTAPI为例,明确RESTAPI后端开发中要做的核心工作,然后介绍DjangoRESTframework可以帮助我们简化RESTAPI开发工作。Web应用模式在Web应用的开发中,有两种应用模式:前端和后端不分离。前后端不分离。页面由后端渲染或重定向,即后端需要控制前端的显示,前后端耦合度很高。这种应用方式比较适合纯web应用,但是当后台连接到App时,App可能不需要后台返回一个HTML网页,只需要返回数据本身,所以后台原本返回给App的接口网页不再适用于前端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。版本控制应将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字段中区分版本号(参见[VersioningRESTServices](http://www.informit.com/artic...)):Accept:vnd.example-com.foo+JSON;版本=1.0接受:vnd.example-com.foo+json;版本=1.1接受:vnd.example-com.foo+json;版本=2.03。路径(Endpoint)路径也叫“端点”(endpoint),意思是API的具体URL,每个URL代表一个资源(resource)(1)Resources作为URL只能有名词不能有动词,所用的名词通常对应于数据库的表名。例如,以下是错误的示例:/getProducts/listOrders/retreiveClientByOrder?orderId=1为了结构简洁,您应该始终使用名词。此外,利用HTTP方法允许在URL中分隔资源名称。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/products3.HTTPverbs对资源的具体操作类型,用HTTPverbs表示。常用的HTTP动词如下(对应的SQL命令在括号内)。GET(SELECT):从服务器获取资源(一项或多项)。POST(CREATE):在服务器上创建一个新的资源。PUT(UPDATE):更新服务器上的资源(客户端提供改变后的完整资源)。删除(DELETE):从服务器中删除一个资源。还有三个不常用的HTTP动词。PATCH(UPDATE):更新(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、状态码(StatusCodes)服务器返回给用户的状态码和提示信息常见如下(状态码对应的HTTP动词在方括号内)。200OK-[GET]:服务器成功返回用户请求的数据。201CREATED-[POST/PUT/PATCH]:??用户成功创建或修改数据。202Accepted-[*]:表示请求已进入后台队列(异步任务)204NOCONTENT-[DELETE]:用户删除数据成功。400INVALIDREQUEST-[POST/PUT/PATCH]:??用户发送的请求有错误,服务器没有执行创建或修改数据的操作。401Unauthorized-[*]:表示用户没有权限(token、用户名、密码错误)。403Forbidden-[*]表示用户已获得授权(与401错误相反),但访问被禁止。404NOTFOUND-[*]:用户发送的请求是针对一条不存在的记录,服务器没有进行任何操作,是幂等的。406NotAcceptable-[GET]:用户请求的格式不可用(比如用户请求JSON格式,但只请求XML格式)。410Gone-[GET]:用户请求的资源被永久删除,不会再次获取。422无法处理的实体-[POST/PUT/PATCH]创建对象时发生验证错误。500INTERNALSERVERERROR-[*]:服务器发生错误,用户将无法确定请求是否成功。有关状态代码的完整列表,请参见此处或此处。7.错误处理(Errorhandling)如果状态码是4xx,服务器应该返回错误信息给用户。一般来说,error作为返回信息中的键名,错误信息作为键值。{错误:“无效的API密钥”}8.返回结果针对不同的操作,服务器返回给用户的结果应满足以下规范。GET/collection:返回资源对象的列表(数组)GET/collection/resource:返回单个资源对象POST/collection:返回新生成的资源对象PUT/collection/resource:返回完整的资源对象PATCH/collection/resource:returnsCompleteresourceobjectDELETE/collection/resource:returnanemptydocument9.超媒体(HypermediaAPI)RESTfulAPI最好实现Hypermedia(即在返回的结果中提供链接到其他API方法),这样用户就不用搜索文档,也知道下一步该做什么。比如Github的API就是这样设计的。访问api.github.com将获得所有可用API的URL列表。{"current_user_url":"https://api.github.com/user","authorizations_url":"https://api.github.com/authorizations",//...}从上面,如果想获取当前用户的信息,应该访问api.github.com/user,然后会得到如下结果。{"message":"Requiresauthentication","documentation_url":"https://developer.github.com/v3"}以上代码表示服务器给出提示信息和文档的URL。10、其他服务器返回的数据格式尽量使用JSON而不是XML。____本期到此结束,敬请期待下一期,喜欢的话点个赞,谢谢