首页 > 其他分享 >django之视图层

django之视图层

时间:2022-12-13 20:45:05浏览次数:51  
标签:函数 request 视图 django json HttpResponse view

django之视图层

视图函数结构

视图函数的参数与返回值

每一个用来处理请求的视图函数,默认都需要一个request形参来接收request对象。

每一个用来处理请求的视图函数必须返回一个HttpResponse对象,包括我们三个响应函数:

  • HttpResponse(一些数据)

    def func1(request):return HttpResponse("返回给网页的内容")

  • render(request, "html模板",{模板数据字典})

    def func2(request):return render(request,"aaa.html",{"useronfo":userinfo,})

    处理模板语法,返回html页面内容

  • redirect(重定向的网址)

    def func3(request):return redirect("/home")

    重新向指定网址发送一个请求

  • JsonResponse(python数据)

    from django.http import JsonResponse
    def func4(request):
        return JsonResponse({'a':'aaa','b','bbb'})  # 将Python字典数据处理成Json数据传给前端
    
    def func5(request):
        user_dict = {'a':'大爷','b','bbb'}
    	# 查源码可知,可以书写json序列化的参数,也可以让python数据不局限于字典
        return JsonResponse(user_dict, json_dumps_params={ensure_ascii:False},safe=False)
    

    对json源码的简析:

        def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                     json_dumps_params=None, **kwargs):
            if safe and not isinstance(data, dict):  # safe默认为真,为真时,只接收字典数据
                raise TypeError(
                    'In order to allow non-dict objects to be serialized set the '
                    'safe parameter to False.'
                )
            if json_dumps_params is None:  # 如果没有传入json序列化相关参数,就设置为空字典
                json_dumps_params = {}
            kwargs.setdefault('content_type', 'application/json')
            data = json.dumps(data, cls=encoder, **json_dumps_params)
            super().__init__(content=data, **kwargs)
    

关于返回值为HttpResponse对象这一点

第一个我们尚可理解,因为HttpResponse就是一个类,它所产生的的对象就是HttpResponse对象,我们将其返回出去,并最终传到浏览器,经过http渲染变成用户可以看到的内容。

后面三个是函数,而底层实际上是将函数的返回值设置为了HttpResponse对象。

视图函数request对象

我们可以通过路由层传输过来的request对象获取:

  • GET:get请求携带的数据
  • POST:post请求携带的数据
  • FILES:表单标签提交的文件数据

form表单携带文件类型数据需要在form表单中添加两个属性:

  • method属性必须是post
  • enctype属性必须是multipart/form-data

这样我们就可以通过request.FILES得到一个文件字典,键为input标签的name属性,值为input标签提交的文件,我们可以对文件进行保存、读取等操作。

视图函数逻辑功能

视图函数作为我们的后端函数,它肩负着处理数据逻辑的功能,这也需要它能与数据库打交道,在请求生命流程图中也提到了,视图层通过模型层可以绕开sql语句来与对数据库的表进行增删改查。

而除了处理数据的逻辑,我们也需要对前端界面的一些元素做动态的处理,如将我们后端的变量数据传到前端页面中,或者对前端页面的某些标签做逻辑的处理,这些则需要用到模板语法了,在django项目中,这个工作就是通过render做的,它接收html页面和后端数据,对页面中的模板语法进行识别做后端的处理,最终将处理完的页面打包为HttpResponse对象。

视图层之FBV和CBV

FBV(fuction based view):基于函数的视图,上文所说的都是FBV

CBV(class based view):基于类的视图吗,与FBV有些许的不同。

CBV结构

视图文件中:

from django import views
class MyLoginView(views.View):  # 视图类必须继承views.View
    def get(self, request):  # 根据请求方式命名的类体函数
        return HttpResponse('from CBV get function')  # 返回的还是HttpResponse对象

    def post(self, request):
        return HttpResponse('from CBV post function')

路由文件中:

from apps import views

..
path('login/', views.MyLoginView.as_view())
..

通过上面的代码得知,实际上CBV本质还是FBV,最终路由所索引到的函数还是视图类中的某个视图函数。

CBV源码剖析

  1. views.MyLoginView.as_view()与其他路由所对应的视图函数相比,CBV路由所对应的是视图类的某个方法,而这个as_view并不在我们定义的类中。那么as_view很有可能是我们继承的父类View中的,我们ctrl键跟上去查看。

    image

    发现,as_view的返回值是一个函数,与我们其他路由所对应的视图函数相呼应,我们可以猜测这个函数返回值是一个视图函数。

  2. 带着这个猜想我们展开view函数进行查看:

    image

    发现这个返回值仍然不是一个明确的函数,我们还需要查看dispatch方法的返回值,在此之前,我们需要分析出,dispatch是绑定对象的动态方法,这个self是由我们自己定义的类所产生的对象。

  3. 查看dispatch函数,由于我们对象及其类的属性中都没有dispatch,所以这个函数还是我们父类View的类体函数:

    image

至此,我们就剖析出,我们的as_view()函数做了这么几件事:

  • 封装了一个函数,作为对应路由的函数
  • 封装的函数中,让我们的自定义类产生了一个对象,并让对象执行方法dispatch返回结果
  • dispatch辨认了请求方式,根据请求方式返回了某个类体函数的结果(HttpResponse对象)

所以视图类,就是将一个路由根据请求方式又重新划分了不同的视图函数,不必再在视图函数中对请求方式进行判断了。

标签:函数,request,视图,django,json,HttpResponse,view
From: https://www.cnblogs.com/Leethon-lizhilog/p/16980560.html

相关文章

  • django之视图层
    目录django之视图层视图层必会三板斧JsonResponse对象request对象获取文件FBV与CBVCBV源码解析django之视图层视图层必会三板斧用来处理请求的视图函数都必须返回HttpRe......
  • django模板层
    目录django模板层模板语法传值模板语法传值特性模板语法之过滤器(内置函数)django模板层模板语法传值1.精准传值returnrender(request,'01.html',{'a':name,'......
  • django 4 视图层
    今日内容详细目录今日内容详细视图层视图层之三板斧JsonResponse对象视图层之request对象获取文件视图层之FBV与CBVCBV源码剖析模板层模板语法之传值操作模板语法之传值特......
  • 视图层
    昨日内容回顾数据增删改查可视化界面1.request对象方法 request.GET\request.POST\request.method2.数据库迁移命令 makemigrations\migrate3.form表单提交数据......
  • Django4
    路由分发1.django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由),很明显太冗余也不便于管理,这个时候也......
  • django框架(部分讲解)
    路由分发django每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由......
  • python之路48 django 视图层、模板层
    视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象完全正确classHttpResponse:passreturnHttpResponse()defrender():returnH......
  • django 视图层
    简介:视图层三板斧详解,JsonResponse对象,request对象获取文件,FBV与CBV,CBV源码剖析目录视图层视图层三板斧详解JsonResponse对象request对象获取文件FBV与CBVFBVCBV源码剖析......
  • django之路由分发,名称空间,虚拟环境,视图层之必备三板斧,JsonResponse对象,视图层之reques
    路由分发应用场景:1、Django的每一个应用都可以有自己的templates文件夹,urls.py、static文件夹,正是基于这个特点,Django能够非常好的做到分组开发(每个人只写自己的app),公......
  • django之视图层
    目录视图层之必会三板斧JsonResponse对象视图层之request对象获取文件视图层之FBV与CBVCBV源码剖析(重要)视图层之必会三板斧用来处理请求的视图函数都必须返回HttpRespo......