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)

补充:

装饰器其实就是一个函数

最新文章

  1. Android语录
  2. DOM官方定义
  3. UDS(ISO14229-2006) 汉译(No.1 范围)
  4. 转: YAML 语言教程 from(阮一峰)
  5. Windows Server 2012及以上安装IIS的步骤
  6. Jar mismatch! Fix your dependencies的问题(转)
  7. 【模拟】Codeforces 711A Bus to Udayland
  8. 【SQL Server】SQL与Excel的数据互通导入导出
  9. Swift Array copy 的线程安全问题
  10. memcache的原理和命中率的总结
  11. RobotFramework下的http接口自动化Get Response Body关键字的使用
  12. Redis的事务和watch
  13. C++与蓝图互调
  14. scrum第二次冲刺
  15. 利用Solr服务建立的站内搜索雏形
  16. 在PL/SQL中调用存储过程--oracle
  17. Fiddler 抓取 Genymotion 数据包
  18. 【SQL模板】二.创建表视图模板TSQL
  19. php的类型运算符instanceof(用于确定一个 PHP 变量是否属于某一类 class 的实例)
  20. shell出现syntax error near unexpected token `<' 解决方法

热门文章

  1. SpringBoot | 启动异常 | 显示bulid success 无 error信息
  2. CentOS7 adb
  3. django (四) model模型
  4. PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常
  5. Ubuntu下修改权限时出现"unable to execute /bin/chmod: Argument list too long"
  6. Maven + Docker
  7. mysql自己编写启停脚本
  8. Unity Shader入门精要学习笔记 - 第7章 基础纹理
  9. 服务器 未能加载文件或程序集“XXXX”或它的某一个依赖项。试图加载格式不正确的程序。
  10. jquery mobile 的手指上下滑动文章、导航栏