一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用
''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example.com :尽量将API部署在专用域名(会存在跨域问题) --https://example.org/api/ :这个写法简单,推荐使用 3.版本 --https://api.example.com/v1/ 把版本号放在请求头中 4.路径 在网络上任何东西都是资源,均使用名词表示(可复数) --127.0.0.1/books/ 5.method 通过请求方式来表示进行的操作 --127.0.0.1/books/ get请求:表示获取所有图书 --127.0.0.1/books/1 get请求:表示获取id为1的图书 --127.0.0.1/books/ post请求:表示新增一本书 --127.0.0.1/books/ delete请求:表示删除一本书 --127.0.0.1/books/ put/patch请求:表示修改一本书 6.过滤 通过在url上传参的形式传递搜索条件 7.状态码 1 开头: 服务器正在处理 2 开头: 服务器处理成功 3 开头: 重定向 4 开头: 客户端错误 5 开头: 服务器错误 --注意:再返回的数据中携带状态码 8.错误处理.应返回错误信息,error当做key 9.返回结果针对不同操作,返回数据格式不同
--所有数据:列表
--删除数据:返回一个空 {status:100,error:'删除成功!',data:''}
--修改数据:{status:100,error:'修改成功!',data:{id:1,title:'西游记'}}
10.返回结果中提供链接 总结:必须说出来的就两条: 1.路径都用名词表示 2.请求方式不同,表示不同的操作 '''
''' 什么是闭包函数? 内部函数有对外部函数作用域的引用 getattr反射 handler是请求函数的内存地址 '''
#url是一个函数,第一个参数是正则表达式,第二个参数是函数的内存地址 url(r'^books/', views.Books.as_view()) #当程序启动的时候,url这个函数已经执行,第二个位置参数已经形成了一个函数的内存地址(as_view()返回值的是源代码中view这个函数的内存地址) #比如来了一个get请求,拿到第二个位置参数内存地址加括号执行,其实就是view(request, *args, **kwargs),本质就是执行dispatch(request, *args, **kwargs) #dispatch方法内部通过请求方式(get,post),反射出要执行的方法,去执行,然后返回(return handler(request, *args, **kwargs)) handler是请求函数的内存地址
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from django.views import View class Books(View): def get(self,request): l1=[{'id':1,'title':'追风筝的人'},{'id':2,'title':'解忧杂货店'}] #如果转列表一定要写safe=False,否则会报错 如果转字典不需要 return JsonResponse(l1,safe=False,json_dumps_params={'ensure_ascii':False}) def post(self,request): return HttpResponse('ok')
''' 在Django中 urlencode编码 formdata编码 json编码:request.POST是没有值的,只能从body中取出,直接处理 -urlencode和formdata编码,request.POST可以提供值 '''
''' drf框架 在原来django框架的基础上多做了一些事 安装:djangorestframework rest_framwork本质上是一个app,要使用它我们需要在settings中对其进行配置 只要用drf,以后写的都是cbv drf提供的:序列化组件 视图组件 解析器 认证组件 权限组件 频率组件 分页器 响应器 url控制器 版本控制 '''
url(r'^books/', views.Books.as_view())
from django.shortcuts import render,HttpResponse from django.http import JsonResponse from rest_framework.views import APIView class Books(APIView): def get(self,request): l1=[{'id':1,'title':'追风筝的人'},{'id':2,'title':'解忧杂货店'}] #如果转列表一定要写safe=False,否则会报错 如果转字典不需要 return JsonResponse(l1,safe=False,json_dumps_params={'ensure_ascii':False}) def post(self,request): return HttpResponse('ok')
''' APIView继承的是View 比如①get请求来了,执行APIView中的as_view(),只要继承了APIView,都没有csrf校验了,源码中本质还是执行的View中的as_view方法内部的view闭包函数,view闭包函数中执行了dispatch方法 ②先在业务逻辑层找有没有dispatch方法,没有直接到父类(APIView)中找,现在执行的不再是View中的dispatch方法,而是APIView的dispatch方法,返回一个request对象(这个request对象已经不是原生的request对象,但是内部包含了原生request对象),APIView中的dispatch方法中调用了initial方法,这个方法中包含了认证,权限以及频率组件 ③dispatch方法内部通过请求方式(get,post),反射出要执行的方法,去执行 在rest_framwork中将原生request赋给了_request,在业务逻辑层request.GET仍可以使用,首先找自己request中有没有,如果没有,从self._request中找,就可以找到原生的request中的GET. 在drf框架中request.GET,request._request.GET以及request.query_params是一样的 request.data 这个data是post,put的内容都在里面 '''