# django -模板层:模板语法 xx.html static -视图层: 请求,响应 -路由层: path,re_path,有名分组,include,转换器。。。 -模型层:orm,单表,多表。。。 ----------------------------- ajax forms 分页 auth 中间件 ------------上次课回顾---- # 序列化类: -序列化: -写一个序列化类:必须要继承Serializer及其子类 -在类中写字段:字段类,字段参数 -在view中使用:ser=实例化得到序列化类的对象(instance=qs,对象,many=True) -ser.data 字典 -反序列化 -新增 -在view中,ser=BookSerializer(data=request.data) -ser.is_valid() -ser.save() -一定要重写 create -修改 -在view中,ser=BookSerializer(instance=对象,data=request.data) -ser.is_valid() -ser.save() -一定要重写 update -数据校验 -字段自己的 -局部钩子 -全局钩子 # source # 两种方式定制要序列化的字段 -方式一:序列化类中:SerializerMethodField,配合一个方法get_字段名,返回什么,字段就是什么 -方式二:表模型中写方法,返回什么 在序列化类中 publish_detail=serialzier.CharField() # read_only 和write_only今日内容
# 1 入门 -前后端开发模式 -API接口 -postman使用 -序列化和反序列化 -restful规范 -drf:第三方app--》快速实现符合restful规范的接口 -以后写的都是视图类,都是继承APIView及其子类 -cbv的执行流程 -路由中:视图类.as_view()---->View的as_view类的绑定方法----》闭包函数view -请求来了:执行闭包函数view(request)--->self.dispatch(request, *args, **kwargs) -View:dispatch:根据请求的方式,执行视图函数中以请求方式命名的方法 -反射:通过字符串动态的获取,设置,判断 对象中得属性或方法 -getattr: res=getattr(self,'run',None) -setattr: setattr(self,'speak',内存地址) self.speak() -hasattr: hasattr(self,'run') -APIView 继承了View,执行流程 -APIView的as_view了:1 调用了父类的as_view 2 去掉了csrf -请求来了,执行View的as_view的闭包view---》dispatch -APIView的dispatch -1 包装了新的request -2 在执行视图函数之前:执行了三大认证 -3 执行了视图函数:请求方式是什么,就执行视图函数中得什么方法 -4 全局异常捕获:全局异常,统一返回格式 -序列化类 -Serializer -ModelSerializer -序列化 -反序列化 -校验 -请求与响应 -Request类:属性和方法 -Response类 -视图层(2基类,5个扩展类,9个子类,视图集) -路由的使用 -认证,频率,权限 -过滤,排序,分页 -全局异常处理 -接口文档:自定生成,自己写 -前后端分离:jwt认证方式--登录 -公司内部:RBAC -djagno:admin 美化1 drf之请求与响应
# 继承APIView后,请求对象:requets---》每一次请求都是一个新的request # Request类:属性或方法 -data:POST、PUT、PATCH请求方式解析后的数据 -原生djagno,put提交的数据在request.POST中是取不到的 -query_params -其他的用起来跟之前一样用(FILES,method,path....)--->d底层原理 __getattr__ # Response类 data=None, # 字典,列表---》序列化成json格式字符串,返回给前端(放在http响应的body中了) status=None, # http 响应的状态码,默认是200,201 -drf帮咱们把所有的http响应状态码都做成了常量,可以直接导进来用 headers=None, # http的响应头,字典 {name:lqz} -原生django要在响应头中加数据 res=JsonResponse(d) res['rrr'] = 'yyyy' return res template_name=None, # 了解:在浏览器中看到好看的页面,指定的模板 content_type=None # 响应的编码格式(json)1.2 drf能够解析的请求编码,响应编码
能够解析的请求编码
# 默认能解析: -urlencoded -form-data -json # 其实通过配置完成:项目中没有配置,是在drf内置的配置文件中提前配好了 -drf也是有两套,一套是项目中得配置(settings.py),一套是默认的配置 -drf的配置文件settings.py中有 DEFAULT_PARSER_CLASSES(默认的解析类) -'rest_framework.parsers.JSONParser', 可以解析json格式 -'rest_framework.parsers.FormParser', 可以解析urlencoded格式 -'rest_framework.parsers.MultiPartParser' 可以解析form-data格式 -想让我们的接口只能接受json格式 -方式一:全局配置---》项目配置文件---》以后所有的接口都遵循这个配置 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', # 'rest_framework.parsers.FormParser', # 'rest_framework.parsers.MultiPartParser', ], } -方式二:局部配置 class TestView(APIView): parser_classes = [JSONParser,FormParser,MultiPartParser] -总结: -解析类的使用顺序:优先用视图类自己的,然后用项目配置文件,最后用内置的 -实际项目如何配置 -基本上都运行JSONParser,FormParser -如果上传文件只允许MultiPartParser
响应编码
# 如果用浏览器,好看的样子,如果用postman看到json格式 -默认请情况下,响应的编码是根据客户端类型决定的 # 全局配置:在项目的配置文件 REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ # 'rest_framework.renderers.JSONRenderer', # json格式 'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式 ] } # 局部配置: class TestView(APIView): renderer_classes = [JSONRenderer,] # 实际编码中,响应一般步配,就用默认2 drf之视图组件
# 由于drf提供了一个顶层的视图类APIView,咱们可以通过继承APIView写视图类 # 后期咱们要写的代码可能重复代码比较多,就可以使用面向对象的继承,封装3 2个视图基类
# APIView # GenericAPIView-->继承了APIView -类属性: queryset = User.objects.all() serializer_class = UserSerializer -方法: self.get_object() # 根据pk获取单个数据 self.get_serializer # 获取要使用的序列化类 self.get_queryset() # 获取所有要序列化数据3.1 基于APIView写5个接口
class UserView(APIView): def get(self, request): book_list = User.objects.all() ser = UserSerializer(instance=book_list, many=True) return Response(ser.data) def post(self, request): ser = UserSerializer(data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': "新增成功"}, status=201) else: return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(APIView): def get(self, request, pk): book = User.objects.filter(pk=pk).first() ser = UserSerializer(instance=book) return Response(ser.data) def put(self, request, pk): book = User.objects.filter(pk=pk).first() ser = UserSerializer(instance=book, data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': "修改成功"}, status=201) else: return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk): User.objects.filter(pk=pk).delete() return Response('')3.2 基于GenericAPIView写5个接口
from rest_framework.generics import GenericAPIView class UserView(GenericAPIView): queryset = User.objects.all() serializer_class = UserSerializer def get(self, request): book_list = self.get_queryset() ser = self.get_serializer(instance=book_list, many=True) return Response(ser.data) def post(self, request): ser = self.get_serializer(data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': "新增成功"}, status=201) else: return Response({'code': 101, 'msg': ser.errors}) class UserDetailView(GenericAPIView): queryset = User.objects.all() serializer_class = UserSerializer def get(self, request, pk): book = self.get_object() ser = self.get_serializer(instance=book) return Response(ser.data) def put(self, request, pk): book = self.get_object() ser = self.get_serializer(instance=book, data=request.data) if ser.is_valid(): ser.save() return Response({'code': 100, 'msg': "修改成功"}, status=201) else: return Response({'code': 101, 'msg': ser.errors}) def delete(self, request, pk): self.get_queryset().filter(pk=pk).delete() return Response('')作业
1 使用GenericAPIView写出book的5个接口 ---有能力的同学写 2 使用面向对象,写5个父类, 继承GenericAPIView+某几个父类后,就有某几个接口 新增1条 GenericAPIView+Create --- 3 9个视图子类 -----大部分人完成上面 4 两个视图类 合二为一(99.99%)
评论列表