首页 > 其他分享 >4.视图类接口

4.视图类接口

时间:2024-08-01 10:41:15浏览次数:12  
标签:get self request 接口 视图 data class serializer

【一】项目改名

  • 重命名目录

  • 重命名项目

    • 设置--语言和框架--Django:配置正确的 Django项目根、设置
  • 改项目文件夹名

    • 需使用全局替换,将原本的项目名替换成新的项目名
    • 重新配置Django服务器

【二】模块与包导入规则

1)介绍

  • 模块:就是一个py文件
  • 脚本:可直接右键运行的py文件
  • 包:含有__init__.py的文件夹

2)导入规则

  • 绝对导入

    • 导入的根是环境变量,若路径在环境变量中,可直接以此路径为根导入

    • 打印环境变量:print(sys.path)

    • [	# 项目目录
          'E:\\Python\\0\\djangoProject_day3', 
          'E:\\Python\\0\\djangoProject_day3', 
          # python自带模块(os,time...)
          'E:\\Python\\Py3.10.8\\python310.zip',
          'E:\\Python\\Py3.10.8\\DLLs',
          'E:\\Python\\Py3.10.8\\lib',
          'E:\\Python\\Py3.10.8', 
          # 下载的第三方模块
          'E:\\Python\\Py3.10.8\\lib\\site-packages', 
      ]
      
  • 相对导入

    • 相对于的是当前py文件

【三】断言

1)使用

name = 'abc'
if name != 'abc':
    raise ValueError('name错误')
print(name)
# -------------等价于-----------
name = 'abc'
assert name == 'abc', 'name错误'
print(name)
  • 使用位置
    • 确定某些值的功能或类型等

【四】drf之请求响应

1)drf请求

  • 支持三种编码格式
    • 取出请求体的内容request.data

1.局部使用

  • 在视图类(views)上配置如下内容

    from rest_framework.parsers import JSONParser, FormParser,MultiPartParser
    
    class BookView(APIView):
        # 只允许json格式
        parser_classes = [JSONParser]
    

2.全局使用

  • settings.py内配置如下内容

    REST_FRAMEWORK = {
        # 请求:发送的编码格式
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
            'rest_framework.parsers.MultiPartParser',
        ]
    }
    

3.使用顺序

  • 优先:视图类 中配置的parser_classes
  • 其次:项目配置 中 REST_FRAMEWORK下的DEFAULT_PARSER_CLASSES
  • 默认:drf内置的,三个全支持

2)drf响应

  • 控制返回的编码格式

1.局部使用

  • 在视图类上配置如下内容

    from rest_framework.renderers import JSONRenderer
    class BookViewSet(APIView):
        # 以json格式显示出来
        renderer_classes = [JSONRenderer]
    

2.全局使用

  • settings.py内配置如下内容

    REST_FRAMEWORK = {
        # 响应:返回展示的编码格式
        'DEFAULT_RENDERER_CLASSES':[
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ]
    }
    

【五】视图基类 APIView

  • 路由

    urlpatterns = [
        path('book/', BookViewSet.as_view()),
        path('book/<int:pk>/', BookDetailViewSet.as_view())
    ]
    
  • 视图类

    from rest_framework.views import APIView
    
    class BookViewSet(APIView):
        # 查询全部
        def get(self, request):
            books = Book.objects.all()
            serializer = BookModelSerializer(instance=books, many=True)
            return Response({'code': 200, 'message': '查询成功', 'data': serializer.data})
    
        # 添加图书
        def post(self, request):
            serializer = BookModelSerializer(data=request.data)
            # 若出错,停止代码,直接抛出异常
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response({'code': 200, 'message': '添加成功', 'data': serializer.data})
    
    class BookDetailViewSet(APIView):
        # 查询单个
        def get(self, request, pk):
            book = Book.objects.get(pk=pk)
            serializer = BookModelSerializer(instance=book)
            return Response({'code': 200, 'message': '查询成功', 'data': serializer.data})
    
        # 改
        def put(self, request, pk):
            book = Book.objects.get(pk=pk)
            serializer = BookModelSerializer(instance=book, data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response({'code': 200, 'message': '修改成功', 'data': serializer.data})
    
        # 删除
        def delete(self, request, pk):
            book = Book.objects.get(id=pk)
            book.delete()
            return Response({'code': 200, 'message': '删除成功'})
    
  • 序列化类

    class BookModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            # 获取指定字段
            fields = ['name', 'publish', 'author_book', 'publish_data', 'author_book_data']
            # 校验书写
            extra_kwargs = {
                'name': {'min_length': 1, 'max_length': 10},
                'publish': {'write_only':True},
                'author_book': {'write_only':True},
                'publish_data': {'read_only':True},
                'author_book_data': {'read_only':True},
            }
            
        publish_data = serializers.SerializerMethodField()
        def get_publish_data(self, obj):
            return {'name': obj.publish.name, 'addr': obj.publish.addr}
    
        author_book_data = serializers.SerializerMethodField()
        def get_author_book_data(self, obj):
            authors = obj.author_book.all()
            list_data = []
            for author in authors:
                list_data.append({'name': author.name, 'gender': author.get_gender_display()})
            return list_data
    

【六】视图基类 GenericAPIView

  • 路由,序列化类:不变

  • 视图类

    from rest_framework.generics import GenericAPIView
    
    class BookViewSet(GenericAPIView):
        ### 要序列化的数据
        queryset = Book.objects.all()
        ### 序列化类
        serializer_class = BookModelSerializer
    
        # 查询全部
        def get(self, request):
            ### 拿到queryset的值
            books = self.get_queryset()
            serializer = self.get_serializer(instance=books, many=True)
            return Response({'code': 200, 'message': '查询成功', 'data': serializer.data})
    
        # 添加图书
        def post(self, request):
            ### 拿到serializer_class的值
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response({'code': 200, 'message': '添加成功', 'data': serializer.data})
    
    class BookDetailViewSet(GenericAPIView):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    
        # 查询单个
        def get(self, request, pk):
            ### 指定pk使用get_object
            book = self.get_object()
            serializer = self.get_serializer(instance=book)
            return Response({'code': 200, 'message': '查询成功', 'data': serializer.data})
    
        # 改
        def put(self, request, pk):
            book = self.get_object()
            serializer = self.get_serializer(instance=book, data=request.data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response({'code': 200, 'message': '修改成功', 'data': serializer.data})
    
        # 删除
        def delete(self, request, pk):
            self.get_object().delete()
            return Response({'code': 200, 'message': '删除成功'})
    

【七】5个视图扩展类

  • 需配合GenericAPIView 使用,可定制

  • 引入

    from rest_framework.mixins import ...
    
    ListModelMixin:查全部
    CreateModelMixin:添加
    RetrieveModelMixin:查单个
    UpdateModelMixin,:修改
    DestroyModelMixin:删除
    
  • 路由,序列化类:不变

  • 视图类

    from rest_framework.generics import GenericAPIView
    from rest_framework.mixins import ListModelMixin, CreateModelMixin,RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
    
    class BookViewSet(GenericAPIView, ListModelMixin, CreateModelMixin):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    
        # 查询全部
        def get(self, request):
            return super().list(request)
        ### 定制示例(查询全部)
        '''
        def get(self, request):
            res = super().list(request=request)
            return Response({'code': 200, 'msg': '查询成功', 'data': res.data})
    	'''
    
        # 添加图书
        def post(self, request):
            return super().create(request)
    
    class BookDetailViewSet(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    
        # 查询单个
        def get(self, request, pk):
            return super(BookDetailViewSet, self).retrieve(request, pk)
    
        # 改
        def put(self, request, pk):
            return super(BookDetailViewSet, self).update(request, pk)
    
        # 删除
        def delete(self, request, pk):
            return super(BookDetailViewSet, self).destroy(request, pk)
    

【八】9个视图子类

  • 引入

    from rest_framework.generics import ...
    
    ListAPIView:查询全部
    CreateAPIView:添加
    RetrieveAPIView:查询单个
    UpdateAPIView:修改
    DestroyAPIView:删除
    ListCreateAPIView:查询全部,添加
    RetrieveUpdateDestroyAPIView:查询单个,修改,删除
    RetrieveUpdateAPIView:查询单个,修改
    RetrieveDestroyAPIView:查询单个,删除
    
  • 路由,序列化类:不变

  • 视图类

    from rest_framework.generics import ListCreateAPIView
    from rest_framework.generics import RetrieveUpdateDestroyAPIView
    
    class BookViewSet(ListCreateAPIView):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    
        ### 定制示例(查询全部)
        def list(self, request, *args, **kwargs):
            res = super().list(request=request)
            return Response({'code': 200, 'msg': '查询成功', 'data': res.data})
    
    class BookDetailViewSet(RetrieveUpdateDestroyAPIView):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    

【九】视图集

  • 序列化类:不变

1)5接口

  • 路由

    from App.views import BookViewSet
    
    urlpatterns = [
        path('book/', BookViewSet.as_view(
            {'get': 'list', 'post': 'create'}
        )),
        path('book/<int:pk>/', BookViewSet.as_view(
            {'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
        )),
    ]
    
  • 视图类

    from rest_framework.viewsets import ModelViewSet
    
    class BookViewSet(ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    
        ### 定制示例(查询全部)
        def list(self, request, *args, **kwargs):
            res = super().list(request=request)
            return Response({'code': 200, 'msg': '查询成功', 'data': res.data})
    

2)2接口(只读)

  • 路由

    from App.views import BookViewSet
    
    urlpatterns = [
        path('book/', BookViewSet.as_view({'get': 'list'})),
        path('book/<int:pk>/', BookViewSet.as_view({'get': 'retrieve'})),
    ]
    
  • 视图类

    from rest_framework.viewsets import ReadOnlyModelViewSet
    
    class BookViewSet(ReadOnlyModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer
    

【十】

GenericAPIView ————》 APIView————》view

标签:get,self,request,接口,视图,data,class,serializer
From: https://www.cnblogs.com/Mist-/p/18336158

相关文章

  • 零件形式的 CLASS 接口式开发
    装载类类中包含仓库接口类装载在装在类中,指针模式获取(指针不慢,new开辟内存慢)把类放堆上初始化时候new实时计算类网络通信接收发送数据时主线程等待会等网走完的,画图是实时的,网是放在新线程里面双核处理器会两个核心交替处理任务管理器中显示的每一个线程那个句柄是进程......
  • VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口
    VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口,8GB内存。基于XILINXVirtexUltraScale+系列,芯片型号为XCVU13P-2FHGB2104I的一款高性能FMC+载板。该板卡集成了3个FMC+(Vita57.4)和2个FMC(Vita57.1)连接器。可以与各种FMC子卡进行完美匹配,为用户提供了功能齐......
  • c# 对接第三方接口实现签名
    usingSystem.Drawing;usingSystem.Text;usingSystem;usingstaticSystem.Net.Mime.MediaTypeNames;usingSystem.Reflection;usingSystem.Xml;usingSystem.Collections.Generic;usingSystem.Xml.Linq;usingSystem.Linq;Console.Write("开始:");UT......
  • C#银行卡ocr识别接口的简单集成方式
    银行卡识别接口是指:以文字识别技术为基础衍生的银行卡卡面信息识别接口,该接口可以快速、精准的将银行卡卡面上包含银行卡号、卡类型、银行名称等文字信息提取成功,以帮助需要支付的平台进行银行卡身份的快速核验。企业又该如何快速的对银行卡识别接口进行集成?可以选择翔云......
  • C#营业执照识别接口、营业执照ocr
    营业执照识别接口,是基于光学字符识别技术的一种将图像中的字符转化为可编辑文本的技术。翔云营业执照识别接口,自主ocr核心技术,可快速精准识别营业执照上的全部字段信息,支持三证合一版营业执照和五证合一版营业执照。翔云营业执照识别接口提供免费测试体验服务,助力企业降......
  • 微信域名屏蔽监测接口+源码
    <?php//填入待检测的域名列表$domainList=array(  'google.com',  'baidu.com',);//遍历域名列表进行检测foreach($domainListas$domain){  $url="https://down.ychengsnsm.com/wx/?url={$domain}";  //发送HTTP请求  $curl=curl......
  • Jmeter简单接口测试
    说明:Jmeter和对应jdk的下载及安装说明,在笔者的其他文章里面可以找到,这里不再赘述,笔者使用的是Jmeter5.3和jdk1.81.在开始讲之前,先讲一下如何看接口信息,一般情况下,开发会有接口文档,如果没有的话,可以在谷歌浏览器按F12抓包,看接口的信息,包括服务器地址,端口号,路径,header信息,请求体等,......
  • 支付宝接口
    真实业务场景的考虑按照支付宝或者微信支付的开发手册的说法,一个标准的客户端接入支付业务模型应该是这样的,我忽略时序图,只用文字描述:用户登录客户端,选择商品,然后点击客户端支付。客户端收集商品信息,然后调用自己业务平台的预付款接口。业务平台根据客户端提交的商品信息,生成......
  • Flink的DateStream API中的ProcessWindowFunction和AllWindowFunction两种用于窗口处
    目录ProcessWindowFunctionAllWindowFunction具体区别ProcessWindowFunction示例AllWindowFunction示例获取时间不同,一个数据产生的时间一个是数据处理的时间ProcessWindowFunctionAllWindowFunction具体示例ProcessWindowFunction示例AllWindowFunction示例总......
  • 在一个系统中访问另一个系统的接口
    当我们需要对两个系统的进行数据交互的时候,我们可能需要在一个系统中调用另一个系统的接口来进行数据的交互。下面是在一个系统中调用另一个系统接口的简单例子。被调用系统(系统A)的接口以及配置:后端的端口号:9091被调用的接口:@Controllerpublicclassindex{@Re......