restful规范:前后端分离:前端一个项目,后端一个项目
1:通常使用HTTPS协议
2.域名部署 api.baidu.com www.baidu.com/api
3.版本 www.baidu.com/api/v2 版本号放在请求头中
4.路径都是名词(可以用复数)
5.根据不同的请求方式,执行不同的操作 delete删除
put和patch操作都是幂等性操作
6.请求地址中携带过滤条件
7.状态码 {'status':100,error:'请勿接地气',data:[]}
8.错误信息
9.响应的数据格式:
所有数据:列表
删除数据:返回一个空
10.返回的数据中携带连接
CBV执行流程
路由中配置 类名.as_view() 本质是一个返回的函数地址
当有请求时:内存地址(request,其他参)
内部又调用的dispatch方法,通过反射,根据请求方式,执行不同方法
序列化组件
写一个类继承Serializer 在类中写要序列化的字段
如name = serializers.CharField()
在View.py中使用book=BookSerializer(book_list,many=True)(调用类进行序列化,序列化格式按照序列化类中字段指定的结果)
book.data 就是序列化后的数据
source的三种用法:1指定字段 2:指定方法 3:深度查询(跨表)
SerializerMethodField,必须配合方法使用get_字段名(self,obj)obj是当前序列化的对象(应该是利用反射)
SerializerMethodField对应的方法中还可以继续使用其他的序列化类
3:rest-framework序列化之ModelSerializer
写一个类继承ModelSerializer 在类内部写:
class Meta:
model = models.Book
fields='__all__' 所有字段
exclude=['name',] 除什么字段之外
depth=1 depth表示深度
重写属性
def validate_name(self,value):
if value.startswith('sb'):
#不能让你过
raise ValidationError('书名不能以sb开头')
else:
return value
#全局钩子函数,对全局字段进行校验
# def validate(self,a):
# # print(a)
# name=a.get('name')
# price=a.get('price')
# if name != price:
# raise ValidationError('错了')
# else:
# return a
校验数据在序列化类中校验
序列化单条数据
book_ser=BookSerializer(instance=book,many=False)
注意book:不是queryset对象,是book对象
5新增一本书
/books/发送post请求,携带json格式数据
6.反序列化之局部,全局钩子(序列化的类一定是继承ModelSerializer的类)
def validate_name(self,value):
if value.startswith('sb'):
raise ValidationError('书名不能以sb开头')
else:
return value
全局钩子函数,对全局字段进行校验
def validate(self,a):
name = a.get('name')
price=a.get('price')
if name !=price:
raise VilidationError('错了)
else:
return a
json在线格式化:https//www.json.cn/