当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 11068106提问 提问时间:2023-11-21 17:26:49阅读次数: 106

最佳答案 问答题库1068位专家为你答疑解惑

视图函数

    • 作用
    • 详解
    • 视图函数的特点
    • 视图类
    • 实际开发怎么用
    • 一个无意义的demo

作用

用于返回给前端数据

详解

    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  # 当前页的数据# 反序列化为jsondata_list = StudentSerializer(current_page_objs, many=True).datares = {"status_code": 200,"message": "分业查询成功","data": {'items': data_list}}return JsonResponse(res)

读者不需要看其他部分,只需要知道视图函数接收的是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).datares = {"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 和datadef 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" % ereturn Response(res_body)def delete(self, request):assert isinstance(request, Request)params = request.query_paramsres_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" % ereturn 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  # 当前页的数据# 反序列化为jsondata_list = StudentSerializer(current_page_objs, many=True).datares = {"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知含义
]
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【Django-01】 视图函数和视图类":http://eshow365.cn/6-41409-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!