其实就是Django RESTful Framework前端
RESTful一种API的命名风格,主要由于先后端分离开发出现python
先后端分离: 用户访问静态文件的服务器,数据所有由ajax请求给到ajax
RESTful风格:数据应该是名词,而动词由HTTP的请求方式来体现django
RESTful风格的API给前端返回 结果对象,不管什么请求方式json
”’ 特色: 反复重复
由于不论什么请求方式,都须要给前端返回对象内容,就是json格式的
因此每次若是有查询的结果对象都须要遍历成字典,和flask相同flask
若是不是get请求是带有内容的请求,那从前端接收的是json格式
每次都须要从request.body中拿出内容,是bytes格式
而后decode解码成json字符串而后再loads成能够给python处理的字典
”’后端
”’
说明:
return JsonResponse(book_list, safe=False)api
对safe的说明,咱们传过去的book_list是一个list格式安全
可是django中认为[]的json格式是不安全的会进行校验
”’
”’
序列化:对查询结果进行遍历,而后转成字典,给到JsonResponse
反序列化:接收前端json处理成字典,而后校验
”’
”’
1.DRF框架工程搭建,创建在django的基础上
安装DRF: pip install djangorestframework
注册DRF: INSTALLED_APPS = [‘rest_framework’,]
在子应用中serializers.py建立序列化器,用于执行序列化和反序列化
在views中类视图使用序列化器,在urls中写地址
”’
”’
2.序列化器: serializer
定义: 其实ModelSerializer是Serializer的子类,更方便有模型类的序列化器的建立,实际产生的序列化器以下
class BookInfoSerializer(serializers.Serializer): 实际继承Serializer
“”“图书数据序列化器”“” 序列化器:执行序列化和反序列化
id = serializers.IntegerField(label=’ID’, read_only=True) read_only:只在输出响应中使用,就是给前端的时候,而前端给咱们传请求的时候,不作验证
btitle = serializers.CharField(label=’名称’, max_length=20)
bpub_date = serializers.DateField(label=’发布日期’, required=False)
bread = serializers.IntegerField(label=’阅读量’, required=False)
bcomment = serializers.IntegerField(label=’评论量’, required=False)
image = serializers.ImageField(label=’图片’, required=False)
字段 : 跟模型类建立很类似,具体存在的字段见讲义 还有经常使用的参数(就是约束)
使用: 建立对象 serializer = Serializer(instance=None, data=empty, **kwarg)
说明: 序列化时,将模型类对象传入instance参数 instance = 序列化对象
反序列化时,将要被反序列化的数据传入data参数 data = 反序列化对象
可经过context参数额外添加数据 即 **kwarg : context={‘request’: request} 经过Serializer对象的context属性获取
”’
”’
3.序列化操做 : 其实就是查询到对象以后,遍历构造字典的过程,而JsonResponse由内置的 Renderer渲染器来执行
3-1.序列化只使用序列化器对象的第一个参数instance
serializer = BookInfoSerializer(instance = book)
经过data属性能够获取序列化后的数据,这个data跟第二个参数可不是一个
serializer.data
{‘id’: 2, ‘btitle’: ‘天龙八部’, ‘bpub_date’: ‘1986-07-24’, ‘bread’: 36, ‘bcomment’: 40, ‘image’: None}
3-2.若是要被序列化的是包含多条数据的查询集QuerySet,添加many=True参数
book_qs = BookInfo.objects.all()
serializer = BookInfoSerializer(book_qs, many=True)
serializer.data
”’
”’
4.关联对象嵌套序列化(由hero->book经过 hbook方法)
4-1.hbook是个外键: PrimaryKeyRelatedField
hbook = serializers.PrimaryKeyRelatedField(label=’图书’, read_only=True)
由于是外键,第二个位置必须有read_only=True 或者 查询集 queryset=BookInfo.objects.all() 要不报错
serializer.data 序列化的时候 结果是 关联对象的主键 {‘hbook’: 2} 即 book.id
4-2.由于id不直观,想要详细内容的字符串,把外键字段改成 : StringRelatedField
hbook = serializers.StringRelatedField(label=’图书’)
结果: {‘hbook’: ‘天龙八部’}
4-3.接口连接: HyperlinkedRelatedField
hbook = serializers.HyperlinkedRelatedField(label=’图书’, read_only=True, view_name=’books-detail’)
必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL 这个view_name传什么:url中有1个参数,是命名空间,是跟它关联
结果: {‘hbook’: ‘http://127.0.0.1:8000/books/2/‘}
4-4.关联对象的指定字段数据 : SlugRelatedField
hbook = serializers.SlugRelatedField(label=’图书’, read_only=True, slug_field=’bpub_date’)
slug_field指明使用关联对象的哪一个字段
结果:{‘hbook’: datetime.date(1986, 7, 24)}
4-5.使用关联对象的序列化器: 直接把所属book的全部内容序列化 hbook = BookInfoSerializer() 结果:{‘hbook’: OrderedDict([(‘id’, 2), (‘btitle’, ‘天龙八部’)te’, ‘1986-07-24’), (‘bread’, 36), (‘bcomment’, 40), (‘image’, None)])}