django是mvt模式,其中v就是这个显示逻辑部分,简单来讲,view函数可以说是接收request,然后处理,返回response的主体函数。

对于一些简单的逻辑关系,可以用直接用函数模式来进行处理。

def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)

如上,很明显的逻辑,函数接收request为参数,然后随便做点事情,把内容放到response中返回,剩下的事情django都会帮我们做完。view的中心思想就是这样,处理显示部分的逻辑。

当然,当我们写一些复杂的逻辑的时候,或者说要在一个视图函数里处理get和post的时候,用这种函数式的表达方法会很复杂,也不容易日后维护和扩展,这个时候django就推荐我们用class来表达来逻辑了。

首先,要通过现象看本质,这个view的主要思想就是处理和返回请求的,无论使用def还是class。

先看一下这两个在urls.py是怎么样被绑定的:def是可以直接被引用的,而class是需要引用其as_view的方法, 但是我们可以换个角度看,在设置url映射的时候,不就是绑定了一个函数嘛。

然后在view函数中,他们又有什么不同呢。def函数表达方式,非常直观,接收request,返回response;而class则没有那么直观,要解释他的逻辑,要从django提供的基本view类讲起。

django.views.generic.base.view这个函数就是django所有内置类的爸爸,这个view类有三个方法,dispatch(),http_method_not_allowed(),options()和一个类方法as_view()。

其中,dispatch就是用来判断request的method,看接下来将这个request派到哪里method的处理函数那里去(如果要用def函数式来做这一步,就需要写一大堆if request.method == get 之类的判断),

http_method_not_allowed则是用来过滤掉某些特定method的,options就是用来设置response的一些可选参数。as_view可以理解为class的出口函数。

注意,这个view基类是没有渲染功能的,也就是说他不能和template进行交互,所以,我们需要在这个基础去扩展(这里就体现出class的优越性,如果是函数式则需要整体改动,而这里只需要去继承)

除了上面介绍的view,这个generic view class,还有两个基本的mixin类,按我个人的理解,view可以单独拿来用,他本身是完整的,但是mixin不可以,mixin往往只有单个功能,所以需要将mixin作为插件来加到view中。django提供了两个基本mixin class,一个是ContextMixin,这个mixin就只有一个方法,就是get_context_data,简单来讲,他就是接收一些字典类的参数,然后这些字典传到template去;第二个是TemplateResponseMixin,其实页数可以当作只有一个方法,就是render_to_response,没错,这个跟shortcuts里面那个一样,可以理解成返回已经渲染好了的response。

总得来说,这两个mixin,一个获取context,一个负责render,就已经可以帮助我们完成很多很多事情了。

来两个官方的例子

class HomePageView(TemplateView):

    template_name = "home.html"

    def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context

这个TemplateView也是django内置的,基类,没错,他也是绝大多数内置class的爸爸,当然除了view,他其实就是View,ContextMixin和TemplateResponseMixin的儿子。看一下他的爸爸们,我们很容想到他能干什么,只要为他指定template,然后定义好context的内容,然后就完了,我们就能得到一个渲染好的response了。看源码可以知道,TemplateView里只有一个方法,就是定义了get(),就没了,也就是说当请求的方式是get,然后这个请求会被View.dispatch传到这个get这里,而这个get要做的也不多,第一步,调用ContextMixi.get_context_data,第二步,将第一步得到的context传到TemplalteResponseMixin.render_to_response,然后就没了。由此可见,其实我们要做的往往就是去调用django为我们准备好的一些组件

class ArticleCounterRedirectView(RedirectView):

    permanent = False
query_string = True
pattern_name = 'article-detail' def get_redirect_url(self, *args, **kwargs):
article = get_object_or_404(Article, pk=kwargs['pk'])
article.update_counter()
return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)

这个RedirectView的主要作用就是重定向,注意其中使用到shortcuts的get_object_or_404

关于django Class-based views的理解的更多相关文章

  1. python 关于django 2.X from django.contrib.auth.views import login

    在学习注册用户的过程中,视图中下面的代码 from django.contrib.auth.views import login 启动django服务时,报错: ImportError: cannot ...

  2. 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  3. 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  4. Understanding Scroll Views 深入理解 scroll view 读书笔记

    Understanding Scroll Views 深入理解 scroll view  读书笔记   It may be hard to believe, but a UIScrollView is ...

  5. Django Class Based View

    本节内容 一   Class Based View 基于类的视图 1.  类的视图 View 2.  类的视图 TemplateView 3.  类的视图 login_required解决方法 二   ...

  6. django中app_name以及namespace理解

    在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下: 大部分情况 这两者有其一就可以了. 并且两者(可以简化理解)无区别 只要一种情况 ...

  7. Django Function Based View(FBV)和Class Based View (CBV)对比

    一.FBV处理过程 首先来看一下FBV逻辑过程: 1.简单过程(借用官方示例): urls: from django.conf.urls import url from . import views ...

  8. Django视图(views)

    1.FBV (基于函数的视图) 实例 url.py url(r'^add_publicer/',views.add_publicer) def add_publicer(request): if re ...

  9. django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)

    models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True),  OneToOneField("Author" ...

随机推荐

  1. NOIP 2016 迟来的满贯

    17-03-22,雨 17-03-22,一个特别重要的日子 在这一天,本蒻攻克了NOIP 2016最难的一题,D1T2——天天爱跑步 实现了NOIP 2016的AK! YAYAYAYAYAYAY 自然 ...

  2. HDU 6212 Zuma 2017青岛网络赛 区间DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6212 解法:看了眼题就发现这个BZOJ 1032不是一毛一样?但是BZOJ上那是个巨坑,数据有错,原来 ...

  3. django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析

    url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...

  4. Django 基于类的视图(CBV)执行流程 CBV 源码分析

    一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...

  5. Django Xadmin - 重构django admin

    一.Django admin的执行流程 https://www.cnblogs.com/weihengblog/p/9122509.html 我的博客,介绍了django admin执行流程 二.Xa ...

  6. 使用postman做接口测试(三)

    三,接口用例的设计 个人感觉用例的设计才是重要的哈,网上查了一些资料总结了一下 1.业务流程测试 通过性验证: 1, 按照接口文档上的参数,正常传参,是否可以返回正确的结果 2, 是否满足前提条件,比 ...

  7. 缓存数据库-redis(管道)

    一:Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常 ...

  8. makefile特殊符号介绍

    http://blog.chinaunix.net/uid-20564848-id-217918.html makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$ ...

  9. nio复习总结

    观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select  epoll等 reactor: io事件触发时, ...

  10. wpf 在Popup内的TextBox 输入法 不能切换

    切换输入法 输入不了中文 [DllImport("User32.dll")] public static extern IntPtr SetFocus(IntPtr hWnd); ...