restful规范和drf模块
restfu1规范
它是一个规范,面向资源架构
10条规范:
1.api与用户的通信协议,总是使用https协议
api网上提供的接口
2.域名:
尽量将api部署在专用域名(会存在跨域问题)
API很简单
3.版本
可以放在路径或请求头中
4.路径,视网络上任何东西都是资源,均使用名词表示
5.method:通过请求方式来表示进行的操作
GET 获取所有图书
POST 表示新增一本书
delete 删除
put/patch 表示修改一本书
6.过滤,通过再url上传参的形式进行传递搜索条件
7.状态码:
1开头 服务器正在处理
2开头 服务器处理成功
3开头 重定向
4开头 客户端错误
5开头 服务器错误
注意:在返回的数据中携带状态码
8.错误处理,应该返回错误信息,error当做key
9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
GET 返回资源对象的列表
GET/1 返回单个资源对象
POST 返回新生成的资源对象
PUT 返回完整的资源对象
PATCH 返回完整的资源对象
DELETE 返回空字典
10.在返回结果中提供链接
总结:必须说出来的,路径都用名词,请求方式不同,表示不同的操作
基于原生django写resful规范的接口
jsonreponse 转列表的时候需要将safe设置为false
CBV的源码执行流程
1.from django.views import View
2.定义一个类继承View
3.定义一个get方法,post方法
1.url当程序启动后,Books.as_view()已经被解析成as_view的view的内存地址
2.比如来了一个get请求,拿到第二个位置参数内存地址加括号执行view(request,*args,**kwargs)
3.又执行了dispatch(request,*args,**kwargs)
4.dispatch方法先去判断请求是否在允许范围内,通过请求方式,反射出要执行的方法,取执行,然后返回
1.路由层
url(r'^register/$', views.Register.as_view())
2.视图层
class Register(View):
def get(self,request):
return render(request,'register.html')
def post(self,request):
my_form = myform.Myform(request.POST)
#1.Register.as_view()我们定义的Register类是没有as_view方法的,故去父类View中找
#2. @classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
.....
return self.dispatch(request, *args, **kwargs)
......
return view #view返回的是内层闭包函数的地址
#3.当我们运行程序时,Register.as_view()已执行,替换为view的内存地址
#4.发起register请求时,执行了view()
def view(request, *args, **kwargs):
.....
#view()本质是执行了dispatch()
return self.dispatch(request, *args, **kwargs)
#5.执行view()本质是执行了dispatch()
def dispatch(self, request, *args, **kwargs):
#request.methode.lower()即get,post...
#self.http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
#判断请求是否合法
if request.method.lower() in self.http_method_names:
#通过反射获得方法,我们定义在CBV函数中的get or post 方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
#如果没有定义就做异常处理
handler = self.http_method_not_allowed
#执行我们定义的get or post方法,我们定义的get或post方法一定需要有返回结果,http协议,要有响应,负责就报错了
return handler(request, *args, **kwargs)
#总结:本质上CBV是执行了dispatch方法,
#我们知道django框架没有提供json数据的封装方法,我们需要自己处理数据,我们使用CBV时,可以重写dispatch方法,在执行dispatch方法前处理json数据,drf框架帮我们封装了处理json的方法
#这也决定了我们使用drf框架时必须采用CBV形式
#补充:
#django会处理urlencode编码和formdata编码数据
#urlencode编码
#formdata编码
#json编码:request.POST是没有值,只能从body中取出,直接处理
#-urlencode和formdata编码,request.POST
drf框架安装
在原来django框架的基础上,帮我们多做了一些封装
安装
1.py36 -m pip install djangorestframework
2.其实就是一个app,需要在settings中配置
3.只要用drf,以后写的都是cbv
drf简单使用
1.基础drf写的cbv
2.from rest_framework.views import APIView
CBV(APIView)
3.之前需要做数据库迁移
4.drf提供的功能
序列化组件,视图组件,解析器,认证组件,权限组件,频率组件,分页器,响应器,url控制器,版本控制
APIView的源码执行流程
1.只要继承了APIView的函数都局部禁用了csrf
2.比如get请求来了,执行view的as_view方法内部的view闭包函数
3.view闭包函数中dispatch方法
4.现在再执行dispatch方法,就是执行APIView的dispatch方法
一.使用django模块时,CBV继承View
使用drf时,需要继承(APIView),APIView也继承了View,帮我们多封装了功能
二.路由层
url(r'^register/$', views.Register.as_view())
三.视图层
class Register(APIView):
def get(self,request):
return render(request,'register.html')
def post(self,request):
my_form = myform.Myform(request.POST)
四. #.Register.as_view()我们定义的Register类是没有as_view方法的,故去父类APIView中找
@classmethod
def as_view(cls, **initkwargs):
....
#调用了View的 as_view()方法
view = super(APIView, cls).as_view(**initkwargs)
....
return csrf_exempt(view)#相当于装饰器,csrf_exempt csrf局部禁用
五.父类的View的as_view()方法
@classonlymethod
def as_view(cls, **initkwargs):
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
#与View的区别 APIView有自己的dispatch方法,故优先调用的是APIView的dispatch方法
return self.dispatch(request, *args, **kwargs)
update_wrapper(view, cls.dispatch, assigned=())
return view
六. APIView的dispatch方法
def dispatch(self, request, *args, **kwargs):
#通过initialize_request方法将request进行封装,不再是之前的原生request
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers
try:
self.initial(request, *args, **kwargs)
#与View的view方法一样了,都是执行自定义的get or post函数
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
response = handler(request, *args, **kwargs)
except Exception as exc:
response = self.handle_exception(exc)
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
七.APIView的initialize_request方法
def initialize_request(self, request, *args, **kwargs):
parser_context = self.get_parser_context(request)
return Request(
request,
parsers=self.get_parsers(),
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context)
补充:
装饰器其实就是一个函数
restful规范和drf模块的更多相关文章
- 接口、RESTful规范、DRF
接口 #接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据 #1.在视图书写处理请求的 视图函数 #2.在路由层为视图函数配置 url链接=>产生接口 #3.前台通过ajax ...
- DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
- day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等
DjangoRsetFramework学习---restful规范,解析器组件,Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...
- DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
- day 87 DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组 ...
- DRF之restful规范、Postman接口测试
一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...
- 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用
一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用
CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()), --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...
随机推荐
- Partition(线段树的离线处理)
有一点类似区间K值的求法. 这里有两颗树,一个是自己建的线段树,一个是题目中给定的树.以线段树和树进行区分. 首先离散化一下,以离散化后的结果建线段树,线段树的节点开了2维,一维保存当前以当前节点为权 ...
- hihocoder1766 字符串问题
思路: 不断贪心增加即可. 实现: #include <iostream> #include <cstring> using namespace std; ][]; int m ...
- 从零开始利用vue-cli搭建简单音乐网站(三)
1.利用router-link在组件之间传递数据 如上图,MainPage.vue中主要有8个推荐曲目数据,主要实现方式是建立好主页面模板,然后用v-for循环获取返回的music对象,然后分别绑定曲 ...
- GetClassName 取得的类名有
今天上午稍微跟踪了一下自己的项目里面的各个空间,得知GetClassName可以取到以下类名:Static\Edit\Button\ComboBox\msctls_trackbar32\SysTabC ...
- Dll加载总是出问题,显示无法加载
我从网上找了一个类似的问题,具体的内容如下 创建了个mfc的共享链接库,里面只有这样一个加法 _declspec(dllexport) int add(int a,int b){ return a+b ...
- [转+补]Android打包so后魅族5中安装运行崩溃问题的解决方法
上周在做噪音检测so集成中,遇到不同的so库打包到 APK 时,安装在某些机器上,出现 java.lang.UnsatisfiedLinkError 加载失败. 为此,深究了一下原理,和给出了解决方案 ...
- explian使用介绍
1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示 ...
- springMVC中jackson的使用(包含JsonFormat 时间格式)
前台使用ajax,后台 springMVC Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Ja ...
- codevs 2618 核电站问题
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会 ...
- 栈的应用——Rails
一.题目描述 某城市有一个火车站,有n节车厢从A方向驶入车站,按进站顺序编号为1~n,经中转站C驶向B.中转站C,这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须以相反的顺序驶出C ...