一.CBV源码分析
cbv和fbv
1.在views中写一个类,继承View,里面写get方法,post方法
2.在路由中配置:url(r'^test/',views.Test.as_view()),实际上第二个参数位置,放的还是一个函数内存地址
3.当请求来了,就会执行第二个参数(request,参数),实质上执行view()
4.view内部调用了dispatch()方法
5.dispatch分发方法,根据请求方式不同,执行的方法不同
二.resful规范
-面向资源架构,面向资源编程
-10个规范
-与后台做交互,通常使用https
-域名:
-https://api.baidu.com(存在跨域问题)
-https://www.baidu.com/api/
-版本
-https://www.baidu.com/api/v1
-https://www.baidu.com/api/v2
-路径,网络上任何东西都是资源,均使用名词表示(可复数)
-https://api.example.com/v1/books
不是:https://api.example.com/v1/delete_one_book
-method来表示增删查改
-https://api.example.com/v1/books get请求,获取所有书
-https://api.example.com/v1/books post请求,新增一本书
-https://api.example.com/v1/book/1 delete请求,删除一本书
-https://api.example.com/v1/book/1 get请求,获取id为1的这本书
-https://api.example.com/b1/book/1 put/patch请求,修改id为1的这本书
-过滤,通过在url上传参的形式传递搜索条件
-https://api.example.com/v1/books?limit=10: 只拿前10本
-https://api.example.com/v1/books?price=10: 只拿价格为10的书
-状态码
-{status:100,}
-错误处理,应返回错误信息,error当作key
{
status:101,
errors:'您没有权限操作这个事'
}
-返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
GET/collection: 返回资源对象的列表(数组)
GET/collection:/resource: 返回单个资源对象
POST/collection: 返回新生成的资源对象
PUT/collection/resource: 返回完整的资源对象
PATCH/collection/resource: 返回完整的资源对象
-返回结果中提供链接(获取一本书)
{
id:1,
name:lxx,
price:12
publish:www.xx.com/api/v1/publish/1
}
三.drf写resful的接口
-先安装
-pip3 install djangorestframework
-简单使用
class DrfTest(APIView):
def get(self,request,*args,**kwargs):
response={'status':100,'errors':None}
response['users']=user_list
# 用drf的Response,可以通过请求客户端来判断返回数据格式是什么样的
return Response(response)
# return JsonResponse(response)
四.drf之序列化
干什么用的? 把python中的对象,转成json格式字符串
-1 写一个类继承
class BookSerializer(serializers.Serializer):
id = serializers.CharField()
title = serializers.CharField()
price = serializers.CharField()
-2 使用(视图类中)
book_ser = BookSerializer(queryset对象/单个对象,many=True/False)
book_ser.data 序列化完成的字典
-总结:
1. 变量名和source指定的值不能一样
2. source = 'publish.name'还支持继续.
3. source 还支持方法(没用)
4. 支持写方法,如下
方法一定传一个参数,是当前book对象
publish_dic = serializer.SerializerMethodField()
def get_publish_dic(self,obj):
return ('id':obj.publish.pk,'name':obj.publish.name)
-在线格式化json
https://www.json.cn/