Django day24 cbv和APIView的源码分析 和 resful的规范
一:cbv的源码分析
1、CBV和FBV的区别:
- Class Base View CBV(基于类的视图)
- Function Base View FBV(基于函数的视图)
2、as_view与view的区别:
- def as_view: 类的方法
- def view:类方法内部,闭包函数定义:内层函数包含对外部作用域的引用
-def view(request,*args,**kwargs):
self = cls(**initkwargs)
if hasattr(self,'get') and not hasattr(self,'head'):
self.head = self.get
self.request = request
self.args =args
self.kwargs = kwargs
# 不管一堆操作,最重要的还是这句话:执行dispatch方法
# 是谁的dispatch方法?写的cbv的那个c,视图中的那个视图类
# 这个类如果没有写dispatch,会执行View中的dispatch方法
return self.dispatch(request,*args,**kwargs)
3、python中一切皆对象:函数也是对象
4、hasattr(self,'get') -- 判断self类中是不是有该(get)方法
5、反射 setattr(self,get,get_all):相当于把get函数,变成了get_all
# 如果不写get方法,请求过来是,就会告诉你,这个方法不被允许
getattr(self,'get'):拿到get函数的内存地址
-def dispatch(self,request,*args,**kwargs):
# request.method 前台请求的方法,转成了小写
# http_method_name View 中定义的一个列表:是一堆请求方式
if request.method.lower() in self.http_method_name:
# getattr 的第三个参数是默认值:self.http_method_not_allowed
# 拿到get方法的内存地址
handler = getattr(self,request.mathod.lower(),aslf.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
# get(request,*args,**kwargs)
*args,**kwargs 传入了这个参数,然后就会去执行get方法,self会自己传过来
# 同理,执行post方法
return handler(request,*args,**kwargs)
6、总结:请求来了---》as_view---》view---》dispatch---》分发到不同的函数,执行函数,拿到结果,然后返回
比如说:我是get请求来的,在dispatch中做了分发
handler(request,*args,**kwargs)执行这个是get,注意执行这个一定要有一个结果
def dispatch(self,request,*args,**kwargs):
#request,*args,**kwargs这堆参数一定要写上,request是必写,*args,**kwargs这两个分别是有名,无名分组
二:resful的规范
1、什么是resful(定义)
是一个规范,简单的说,就是面向资源编程:把网络中所有东西,想象成资源
2、10种规范(*****)
(1)API与用户的通信协议,总是使用HTTPS协议;(2)域名;(3)版本;(4)路径;(5)method 请求方式;(6)过滤;(7)状态码;(8)错误处理;(9)返回结果;(10)返回结果中提供链接
1) 推荐使用HTTPS协议,,,API与用户的通信协议,总是使用HTTPS协议:HTTPS比HTTP安全
2) 域名:例如写一个查询所有图书的API接口
| https://api.example.com/books | 尽量将API部署在专用域名(会存在跨域问题) |
| https://127.0.0.1/api/books | API很简单(推荐使用这一种) |
3)版本:每个接口都有一个版本,这只是一种规范,也可以不按照这样的方式来
| URL,如:https://api.example.com/v1/books | https://api.example.com/v2/books (推荐用这种) |
| 请求头 | 跨域时,引发发送多次请求 |
4)路径:网络上任何东西都是资源,均使用名词表示(可复数)
| 如:https://127.0.0.1/api/v1/books |
| https://127.0.0.1/api/v1/dogs |
| https://127.0.0.1/api/v1/apples |
| 等等······ |
| 注意不能这么写:http://127.0.0.1/api/get_all_books (获取所有图书) |
| http://127.0.0.1/api/add_books (新增一本图书) |
| 统一都用这个: https://127.0.0.1/api/v1/books |
5)method(请求的方式):https://127.0.0.1/api/v1/books用这一个接口就能承载以下的所有请求方案,通过不同的接口,一个请求能干很多事,通过请求的方式来表示是新增,获取,修改,删除资源
| GET : | 从服务器取出资源,发一条get请求(一项或多项) |
| POST : | 在服务器新建一个资源,发一个post的请求 |
| PUT : | 在服务器更新全部资源(修改),发一个put请求(客户端提供改变后的完整资源) |
| PATCH : | 在服务器更新局部资源(修改),发一个patch请求(客户端提供改变的属性) |
| DELETE : | 从服务器删除资源,发一个delete请求 |
6)过滤:前端过滤,https://127.0.0.1/api/v1/books?limit=10 前面还是一样的接口,后面可以传一个参数,指定返回的数量,比如limit=10,只拿10条数据(可以有过滤条件)
| 同理: |
| limit=10 指定返回记录的数据 |
| offset=10 指定返回记录的开始位置 |
| page=2&per_page=100 指定第几页和每页的记录数 |
| name&order=asc 指定返回结果的属性排序和排序顺序 |
| book_type_id=1 指定筛选条件 |
7)状态码:每次请求回去,都需要状态码,状态码可以自定义
| 1开头:正在处理 |
| 2开头:成功 |
| 3开头:重定向 |
| 4开头:客户端错误 |
| 5开头:服务器内部错误(这是后台程序写错了,直接去找bug就行了) |
8)错误处理:应返回错误信息,error当做key
{status:100,,error:‘错误信息写上’}
9)返回结果:针对不同操作,服务器向用户返回的结果应该符合以下规范:
| GET /books:返回资源对象的列表(数组) |
| GET /books/1:返回单个资源对象 |
| POST /books:返回新生成的资源对象,新增--》传数据---》新增完成---》新的资源对象返回 |
| PUT /books/1:返回完整的资源对象 |
| PATCH /books/1:返回完整的资源对象 |
| DELETE /books/1:返回一个空文档 |
相当于又请求了get一次,可以符合规范,也可以不符合,因为这只是一个规范
10)Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
{
status:100
msg:成功
url:https://127.0.0.1/books/1
}
核心:返回结果中提供链接(在这一页的连接地址带一个上一页或下一页的链接地址,这样就不需要拼,直接取出后再发一次请求就可以了)
三:APIView源码分析
四:初识序列化
Django day24 cbv和APIView的源码分析 和 resful的规范的更多相关文章
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- Django rest framework 的认证流程(源码分析)
一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...
- Django(63)drf权限源码分析与自定义权限
前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...
- Django(64)频率认证源码分析与自定义频率认证
前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...
- Django之admin的使用及源码分析
一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...
- Django(44)drf序列化源码分析(1)
序列化与反序列化 一般后端数据返回给前端的数据格式都是json格式,简单易懂,但是我们使用的语言本身并不是json格式,像我们使用的Python如果直接返回给前端,前端用的javascript语言 ...
- Django中CBV View的as_view()源码解析
CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), # CBV写法 url(r'^publish/$', ...
- Django的rest_framework的分页组件源码分析
前言: 分页大家应该都很清楚,今天我来给大家做一下Django的rest_framework的分页组件的分析:我的讲解的思路是这样的,分别使用APIview的视图类和基于ModelViewSet的视图 ...
- Django rest framework 限制访问频率(源码分析)
基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...
随机推荐
- ELK基本统计图表
ELK基本统计图表,现在基本在用自带的功能,复杂的功能还需要去摸索了
- 大神所写的深度好文---Gradle 构建工具
什么是构建工具? 我们大家都知道 Gradle 是一种构建工具,那么什么是构建工具呢? 网上一大堆的文字解释我觉得很难理解,这里我以咱们 Android 开发来举个例子吧. 我们以前开发都是用 Ecl ...
- MFC cstring 型转化成 double型
cstring szNum; GetDlgItemText(IDC_EDIT1, szNum); double Num; Num = _ttol(szNum); 转化成长整型 Num = _tstof ...
- Ansible 利用playbook批量部署Nginx
我这里直接部署的,环境已经搭建好,如果不知道的小伙伴可以看上一遍ansible搭建,都写好了,这里是根据前面环境部署的 192.168.30.21 ansible 192.168.30.25 ...
- [JS]window.location获取url各项参数详解
window.location方法后还还可以带href,search等参数,下面我们来看看获取url各项参数的办法. URL即:统一资源定位符 (Uniform Resource Locator, U ...
- Heaters (codeforces 1066B)
贪心题 策略 在最左边设置一个array 0,每一次从右往左,如果有heater的话就寻找heater左边界是不是小于等于目前的上一个heater的右边界,如果没有一个这样的,那么就直接输出-1 代码 ...
- JAVA正则表达式matcher.find()和 matcher.matches()的区别
1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数.matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数 ...
- SQL上门2
SQL高级教程学习 MySQL的字符匹配和其他数据库不同,一下语句查找(第一个字符不是h,第三个字符是m)不能用“!” select * from country where countryname ...
- array_map 等php回调函数使用问题(关联数组下标获取)
前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看.(我有点代码小洁癖~) 1.array_reduce 当迭代处理一个一维索引数组时,在回调函数内是无法获取到当 ...
- ubuntu18.04安装chrome浏览器
前几天把系统弄崩溃了,弄了好久也没弄好,索性直接装18.04,下面是安装chrom浏览器的步骤,网络上照着16.04安装的,应该是一样的 启动终端. 输入以下命令: sudo wget http:// ...