REST_FRAMEWORK 理解
什么是RESTFUL?
API规范
1.什么是API? —>API就是接口,那什么是接口?接口就是url,在我练习django框架的时候,我们首先就是需要将MVC框架的映射做好,M就是model,V就是View,那model和view之间就需要url作为连接器一样将他们关联起来。当你访问一个地址的时候,我在url路由表中进行映射找到相关联的view视图中的函数或者类,然后进行一个数据的返回,这就是接口的作用,后台工作者将url告诉给前端工作者,前端工作人员在进行数据交互时,利用后端人员的url进行传参。
2 .API十大规范:
1.API与用户的通讯协议应该为https
2.域名的设计(同源策略)(JSONP跨域问题)
3.版本问题
4.路径资源问题(任何名词都可以作为资源)
5.method(传数据方式)——> GET(获取服务器资源)/POST(向服务器新建资源)/PUT(服务器全局更新资源)/
PATCH(服务器局部更新资源)/Delete(服务器删除资源)
6.在url上传参、https://example.org/api/v1/animals?id=1
https://example.org/api/v1/(?p<pk>\d+)
7.状态码和code(状态码是给浏览器的,而code可以是程序员自己定义用来细分异常的)
常见的状态码有:200 连接成功 /201 created/post/put/patch用户新建或者修改成功
202 异步任务 /204 删除数据成功 / 400 用户请求错误 /401 用户无权限
403(Forbidden)访问被禁止 / 404 页面未找到 / 410用户请求资源被永久删除
500服务器发生错误用户将无法判断请求是否成功
8.错误处理 应返回错误信息 error作为返回字典数据的key值
{
error:"Invalid API key"
}
9.返回结果,根据不同的method操作,服务器向用户返回不同的结果
Get/connection:返回资源对象(列表)
Get/connection/resource:返回单个资源对象
Post/connection:返回新生成的资源对象
Put/connection/resource:返回完整的资源对象
Patch/connection/resource:返回完成的资源对象
Delete/connection/resource:删除一个空文档
10.Hypermedia:将一个对象的结果以超链接的方式返回,利用这个链接在做一个url映射,
在serializers序列化时可以进行实现、
略谈CBV/FBV
1.FBV:即(Function Base View) 它是基于函数的视图,在python中def定义的就是函数,在url中写完路由后可以直接写,views.Xxx,适合新入手Django框架的同志编写,有一个缺点就是需要自己去if判断method的类型,比如if method==GET/POST/DELETE:等
2.CBV:即(Class Base View)它是基于类的视图,在url后的编写中一定要加上Views.Xxx.as_view()方法,它的优点就是基于self.dispatch的反射,可以自身去查找数据的method方式在视图类中进行比较、以self.dispatch为入口:
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
这是视图继承于View的操作,最主要进行判断的函数就是getattr()、如果继承APIView则有更多的功能集,比如认证、权限、节流、版本、序列化等、因为APIView也是继承于View,所以相当于丰富了父类的功能。
CBV实现源码分析
1.请求进来,路由找到视图类并执行as_view()方法,执行这个方法时,返回一个view函数
2.执行view函数,其实就是返回一个self.dispatch()方法
3.如果继承于View或者APIView的自写类没有重写dispatch方法,则到父类中去找,如上图所示、
父类中的dispatch会根据请求方式的不同基于python类的反射去找相应的方法然后执行。