1.drf之请求与响应
在继承drf中的APIView时
Request 它的请求对象request就不是原来的那个request了(具体去看APIView源码分析),所以没钱请求的request都是一个新的对象,
这时我们便可以通过request.data取出全部数据,而原来的request是取不到request.data的,只能通过请求来看是取request.GET.get(k)或者request.POST.get(k)中的值且取不到put中的数据,
所以drf中的APIView是为了帮我们更好的拿到数据,其他的跟之前用起来一样,因为他们的底层都是继承了一个共同的父类View。
Response
在源码中有参数data,status,template_name,headers,content_typy(exception不看了)
其中data是将列表字典序列化之后以json的格式返回给前端(放在http响应的body中了)
status 响应状态码
template_name 就是前端模板
content_type 是用来响应前端返回的数据是什么类型的(有json,from/data,url类型)
drf能够解析的请求编码,响应编码
能够解析的请求编码和响应编码被放到drf中steeings的文件中了,这是drf的配置文件,我们可以在我们的项目中把其他模块配置文件中的值给写入到我们项目文件的配制文件底下,在这时这个数据就优先用我们配置文件底下的。
# drf配置中的源文件
DEFAULTS = { # Base API policies 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ], 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser' ] }
此时DEFAULT_PARSER_CLASSES的valve值就是前端返回给后端的格式只能是什么类型的,在项目的配制文件中加入代码接下来我们把json格式给注掉看下详情。
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.TemplateHTMLRenderer', ], 'DEFAULT_PARSER_CLASSES': [ # 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ], }
就会出现不让传json格式的数据
接下来DEFAULT_RENDERER_CLASSES是前端显示的格式,我们把json格式注掉之后,在postman中就直接返回前端的代码,同样的道理,把rest_framework注掉以后在前端就会返回json格式的数据
'DEFAULT_RENDERER_CLASSES': [ # 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.TemplateHTMLRenderer',
我们不仅仅可以在全局的设置里面修改这些配制,我们还可以在局部界面修改这些配置。这些与配置文件中都是一一对应的,一个不写,他就不会显示这种格式
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser from rest_framework.renderers import JSONRenderer,TemplateHTMLRenderer class TestView(APIView): parser_classes = [JSONParser, FormParser, MultiPartParser] class Tes_tView(APIView): renderers_classes = [JSONRenderer, TemplateHTMLRenderer]
上述优先级是自己局部页面加的配置,然后自己项目配置中,最后drf配置,这样优先级来执行。
2.drf之视图组件
自己去了解继承,封装和多态
3.两个视图基类
我们五个接口中大部分代码重复,我们就可以用drf中的GenericAPIView给写到一起,然后在分发下去,这就是两个视图基类,可以理解为基于GenericAPIView写接口
class BookViews(GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self,request): book_list = self.get_queryset() res =BookSerializers(instance=book_list,many=True) return Response(res.data) def post(self,request): res = self.get_serializer(data=request.data) if res.is_valid(): res.save() return Response({'code':201,'msg':'添加成功'}) return Response({'code':201,'msg': res.errors}) class OneBookViews(GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self,request,pk): book_list = self.get_object() res =self.get_serializer(instance=book_list) return Response(res.data) def put(self,request,pk): book_list = self.get_object() res = self.get_serializer(instance=book_list,data=request.data) if res.is_valid(): res.save() return Response({'code':201,'msg':'修改成功'}) return Response({'code':201,'msg': res.errors}) def delete(self,request,pk): self.get_queryset().filter(pk=pk).delete() return Response('')
标签:res,self,request,rest,framework,视图,基类,drf From: https://www.cnblogs.com/shangxin-bai/p/16742158.html