首页 > 其他分享 >drf之视图组件

drf之视图组件

时间:2022-09-29 21:47:57浏览次数:51  
标签:__ ser self request 视图 组件 data class drf

drf请求与响应

1.request请求 :通过http请求,经过OSI协议,拿着前端提供的数据给了django,django把请求给了request的对象,drf又对request进行了一次封装,每次请求都是一个新的request对象,,所以request能够直接点data获取数据

http版本0.9
http1.1  现在基本都是用的这个版本  一个请求通道可以建立多次请求,不断开链接,当不再需要数据传输的时候才会断开连接
http2.0 多路复用 一次发送多条数据 一个请求通道 打包发送 接收
2.Request类的属性和方法
data 可以直接用request.data获取三种编码格式的数据 数据获取出来的是字典 通过Response变成字符串类型返回给前端
# 原生django中的put提交的数据在request.post中提取不了
query_params 相当于django中的request.post 底层原理也是用__getattr__方法
3.Response类 
主要的三个方法: 
 1.data=None 字典或者列表序列化成json格式字符串 返回给前端放在http响应的body中
 2.status=None 状态码 可以直接写,也可用导入封装好的http响应状态码 导入模块即可  默认是200
 3..headers=None  http的响应头 以字典的k:v形式展示   # 可以自定义响应头 
 
 4.template_name=None  在浏览器中看到好看的页面 有指定的模板也可以不加
 5.content_type=None  响应的编码格式 默认是json类型
drf能够解析的请求编码格式
# 默认能够解析:urlencoded,form-data,json
drf中的配置文件settings.py中有(默认的解析)DEFAULT_PARSER_CLASSES:
  -'rest_framework.parsers.JSONParser', 可以解析json格式
  -'rest_framework.parsers.FormParser', 可以解析urlencoded格式
  -'rest_framework.parsers.MultiPartParser' 可以解析form-data格式
可以通过配置修改编码格式或者指定编码格式:
方式1:全局配置 在settings写:以上默认编码格式 不需要的直接注释掉
方式2:局部配置 在自己写的视图类中写:
class TestView(APIView):parser_classes = [JSONParser,FormParser,MultiPartParser]
总结
总结: 解析类的使用顺序:优先使用视图类自己的,然后是项目配置文件的,最后是内置文件的
实际在项目中基本都是使用JSONParser,FormParser
如果上传文件的话,只允许使用MultiPartParser
格式使用越少越能减少出错的概率
响应编码
默认情况下,响应编码是根据客户端类型决定的
分为全局配置:
   REST_FRAMEWORK = {
       'DEFAULT_RENDERER_CLASSES': [
            # 'rest_framework.renderers.JSONRenderer', # json格式
            'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式]}
局部配置: 在视图类中配置
 class TestView(APIView):renderer_classes = [JSONRenderer]      

drf视图组件

视图基类 :APIView和GenericAPIView
# 基于这个写的五个接口 封装的五个方法
基于APIView写五个接口
class BookView(APIView):
    def get(self,request):
        book_list = Book.objects.all()
        ser = BookSerializers(instance=book_list,many=True)
        return Response(ser.data)
#

class BookView(APIView):
    def get(self,request,pk):
        book = Book.objects.filter(pk=pk).first()
        ser = BookSerializers(instance=book)
        return Response(ser.data)


class BookView(APIView):
    def post(self,request):
        ser = BookSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

class BookView(APIView):
    def put(self,request,pk):
        book = Book.objects.filter(pk=pk).first()
        ser = BookSerializers(instance=book,data=request)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)

class BookView(APIView):
    def delete(self,request,pk):
        Book.objects.filter(pk=pk).delete()
        return Response('')


基于GenericAPIView写五个接口
class BookView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

    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(ser.data)
        else:
            return Response(ser.errors)


class BookDetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

    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(ser.data)
        return Response(ser.errors)

    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response()

基于面向对象封装

单方法封装
class Once():  #查询一条数据
    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(instance=book)
        return Response(ser.data)

class More():  # 查询多条数据
    def get(self, request):
        book_list = self.get_queryset()
        ser = self.get_serializer(instance=book_list, many=True)
        return Response(ser.data)

class Amend():  # 修改数据
    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(ser.data)
        else:
            return Response(ser.errors)

class Add():  # 添加数据
    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(ser.errors)
 
class Dle():  # 删除数据
    def delete(self, request, pk):
        self.get_queryset().filter(pk=pk).delete()
        return Response('')

基于单方法组合封装
class MoreAdd(GenericAPIView, More, Add):
    def __init__(self):
        super(More, self).__init__()  # 查询多条数据
        super(Add, self).__init__()  # 添加数据

class OnceDleAmend(GenericAPIView, Once, Dle, Amend):
    def __init__(self):
        super(Once, self).__init__()  # 查询一条
        super(Dle, self).__init__()  # 删除一条
        super(Amend, self).__init__()  # 修改一条

class DelAmend(GenericAPIView, Dle, Amend):
    def __init__(self):
        super(Dle, self).__init__()  # 删除一条
        super(Amend, self).__init__()  # 修改一条

class CheckDle(GenericAPIView, Once, Dle):
    def __init__(self):
        super(Dle, self).__init__()  # 删除一条
        super(Once, self).__init__()  # 查询一条

class AmendCheck(GenericAPIView, Amend, Once):
    def __init__(self):
        super(Amend, self).__init__()  # 修改一条
        super(Once, self).__init__()  # 查询一条

组合封装的查询
class BookView(MoreAdd):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

    def __init__(self):
        super(MoreAdd, self).__init__()  # 查询多条数据/添加数据


class BookDetailView(OnceDleAmend):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

    def __init__(self):
        super(OnceDleAmend, self).__init__()  # 修改数据/查询一条/删除数据

标签:__,ser,self,request,视图,组件,data,class,drf
From: https://www.cnblogs.com/Hsummer/p/16743163.html

相关文章

  • drf学习-4
    一、drf入门流程前后端开发模式API接口postman使用序列化和反序列化restful规范drf:第三方app—快速实现符合restful规范的接口以后写的都是视图类都是继承APIView......
  • 组件之间的传值
    子组件传值给父组件子组件模板中使用$emit()来定义自定义事件,$emit()有两个参数,   第一个参数为自定义的事件名称;   第二个为需要传递给父......
  • drf请求与相应(Request,Response),drf能够解析的请求编码,响应编码,GenericAPIView和APIVi
    drf请求与响应Request类(请求)Response类(响应)drf 能够解析的请求编码,响应编码能够解析的请求编码响应编码GenericAPIView和APIView(2个视图基......
  • drf学习笔记
    今日内容概要drf之请求与响应drf之视图组件两个视图基类今日内容详细补充知识反射:通过字符串动态的获取,设置,判断对象中得属性或方法-getattr:res=getattr(se......
  • vue 动态组件component :is
    示例<componentv-bind:is="currentComponent"></component>currentComponent是要展示的组件,根据具体代码逻辑,currentComponent赋值为不同的组件在切换时保持组件状态,......
  • 在父组件中监听子组件页面是否加载完毕
    在父组件中监听子组件页面是否加载完毕//Parent.vue<Child@mounted="doSomething"/>//Child.vuemounted(){this.$emit("mounted");}//Parent.vue<C......
  • 简单组件讲解
    在编程阶段,会遇到有些页面的某一区域的布局或数据显示类似;那么我们就可以复用这一段代码;在使用原生JS编程时,我们习惯是将代码抽出来自成一个文件,需要时引入即可。而在v......
  • drf之试图基类
    一、请求与响应#现在我们在写视图类的时候都是继承了APIView#而APIView的request都变成了新的request了跟继承了View的request已经不一样了#所以每次请求都是一个......
  • 修改生产订单组件——CO_XT_COMPONENT_CHANGE
    修改组件仓库的范例DATA:lv_poTYPEcoxt_ord_key,ls_componentTYPEcoxt_s_ord_comp_key,ls_requTYPEcoxt_s_quantity,ls_requx......
  • drf之请求与响应,drf之视图组件,2个视图基类
    1.drf之请求与响应在继承drf中的APIView时Request它的请求对象request就不是原来的那个request了(具体去看APIView源码分析),所以没钱请求的request都是一个新的对象,这......