• 【Django-01】 视图函数和视图类


    作用

    用于返回给前端数据
    
    • 1

    详解

        def list(request):
            """
            1.普通的视图函数 request是HttpRequest 函数
            2.且必须用request.GET|request.POST 指定方法是什么方法
            3.返回值不能用 rest_framework包下的Response 必须是
    
            :param request:
            :return:
            """
            assert isinstance(request, HttpRequest)
            page = request.GET.get("page", default=1)
            page_size = request.GET.get("page_size", default=10)
            objs = Student.objects.all()
            # 分页器实现分页
            paginator = Paginator(objs, page_size)  # 构建分页器
            current_page_objs = paginator.get_page(page).object_list  # 当前页的数据
            # 反序列化为json
            data_list = StudentSerializer(current_page_objs, many=True).data
            res = {
                "status_code": 200,
                "message": "分业查询成功",
                "data": {
                    'items': data_list
                }
            }
            return JsonResponse(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    读者不需要看其他部分,只需要知道视图函数接收的是HttpRequest对象。
    其属性有:
    path:路径,不包含域名
    method: 表示请求的方法,为str类型,值为POST, GET
    encoding:数据的编码格式,默认utf-8
    GET: 字典,包含get所有参数
    POST:字典,POST所有参数
    FILES:字典,上传文件的信息
    COOKIES:字典 所有cookie对象
    session:字典 表示会话
    META: 字典,HTTP 头信息,比如agent,ip等
    user:当前登录用户

    视图函数的特点

    视图函数,函数名称何以结合path达到词语达意的意思,比较灵活。比如函数名称为: list_stident(request)
    则url中path(‘list/student’, list_stident)

    视图类

    视图类是封装了接收前端 [‘get’, ‘post’, ‘put’, ‘patch’, ‘delete’, ‘head’, ‘options’, ‘trace’] 方法支持的类,想要任何函数直接继承APIView 即可,这样子固定的路径下,该类自动识别前端请求类型,会自动找到对应的函数,比如前段发送POST请求,则会自动到你实现的POST中。

    实际开发怎么用

    一般是视图函数和视图类结合使用。视图类只提供最基本的:【POST 创建 , PUT修改, DELETE 删除 , GET 创建四个函数】至于其他的api则用视图函数达到 见路径知含义的效果。

    一个无意义的demo

    class StudentApi(APIView):
        """
        1.get/put/post/delte 定义了基础视图
        2.静态函数定义了 其他的功能
        """
        def get(self, request):
            queryset = Student.objects.all()
            data_list = StudentSerializer(queryset, many=True).data
            res = {
                "status_code": 200,
                "message": "查询成功",
                "data": {
                    'items': data_list,
                    'total': len(data_list)
                }
            }
            return Response(res)
    
        # 创建->仅仅传入data参数
        def post(self, request):
            with transaction.atomic():
                serializer = StudentSerializer(data=request.data)
                if serializer.is_valid(raise_exception=True):
                    # save 中做了校验如果存在则更新  否则则是创建
                    instance = serializer.save()
    
                    res = {
                        "status_code": 200,
                        "message": "创建成功",
                        "data": {
                            'id': instance.id
                        }
                    }
                    return Response(res)
    
        # 更新要同时传入  instance 和data
        def put(self, request):
            with transaction.atomic():
                res_body = {
                    "code": 200,
                    "msg": "更新成功",
                    "data": {}
                }
                try:
                    obj = Student.objects.get(id=request.data['id'])
                    serializer = StudentSerializer(instance=obj, data=request.data)
                    if serializer.is_valid(raise_exception=True):
                        instance = serializer.save()
                        res_body["data"]["obj"] = model_to_dict(instance)
                except Exception as e:
                    print(e)
                    res_body["msg"] = "更新失败:%s" % e
                return Response(res_body)
    
        def delete(self, request):
            assert isinstance(request, Request)
            params = request.query_params
            res_body = {
                "code": 200,
                "msg": "删除",
                "data": {}
            }
            try:
                obj = Student.objects.get(id=params["id"])
                obj.delete()
                res_body["data"]["obj"] = model_to_dict(obj)
            except Exception as e:
                res_body["msg"] = "删除失败:%s" % e
            return Response(res_body)
    
        def list(request):
            """
            1.普通的视图函数 request是HttpRequest 函数
            2.且必须用request.GET|request.POST 指定方法是什么方法
            3.返回值不能用 rest_framework包下的Response 必须是
    
            :param request:
            :return:
            """
            assert isinstance(request, HttpRequest)
            page = request.GET.get("page", default=1)
            page_size = request.GET.get("page_size", default=10)
            objs = Student.objects.all()
            # 分页器实现分页
            paginator = Paginator(objs, page_size)  # 构建分页器
            current_page_objs = paginator.get_page(page).object_list  # 当前页的数据
            # 反序列化为json
            data_list = StudentSerializer(current_page_objs, many=True).data
            res = {
                "status_code": 200,
                "message": "分业查询成功",
                "data": {
                    'items': data_list
                }
            }
            return JsonResponse(res)
    
    路由定义为:
    urlpatterns = [
        url(r'^student$', app_view.StudentApi.as_view()),//基本增删改查
        url('^student/list$', app_view.StudentApi.list)  //见path知含义
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
  • 相关阅读:
    【JVM】运行时数据区 - 虚拟机栈(Java栈)
    R语言ggplot2可视化地图并使用scale_fill_gradient函数自定义设置地图颜色刻度为灰色梯度刻度(grey gradient scales)
    Android(基本、高级UI组件)
    spring框架源码九、spring ioc xml与注解组合模式
    3k+星星的eat_pytorch_in_20_days更新啦
    level2行情+在线金融数据库
    Android Termux安装MySQL,并使用cpolar实现公网安全远程连接[内网穿透]
    【OpenCV学习】第1课:加载丶修改丶显示丶保存图像
    Mac 制作可引导安装器
    华为云CDN,如何推动互联网行业健康发展?
  • 原文地址:https://blog.csdn.net/qq_36066039/article/details/134531101