关于django Class-based views的理解
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的理解的更多相关文章
- python 关于django 2.X from django.contrib.auth.views import login
在学习注册用户的过程中,视图中下面的代码 from django.contrib.auth.views import login 启动django服务时,报错: ImportError: cannot ...
- 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...
- 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...
- Understanding Scroll Views 深入理解 scroll view 读书笔记
Understanding Scroll Views 深入理解 scroll view 读书笔记 It may be hard to believe, but a UIScrollView is ...
- Django Class Based View
本节内容 一 Class Based View 基于类的视图 1. 类的视图 View 2. 类的视图 TemplateView 3. 类的视图 login_required解决方法 二 ...
- django中app_name以及namespace理解
在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下: 大部分情况 这两者有其一就可以了. 并且两者(可以简化理解)无区别 只要一种情况 ...
- Django Function Based View(FBV)和Class Based View (CBV)对比
一.FBV处理过程 首先来看一下FBV逻辑过程: 1.简单过程(借用官方示例): urls: from django.conf.urls import url from . import views ...
- Django视图(views)
1.FBV (基于函数的视图) 实例 url.py url(r'^add_publicer/',views.add_publicer) def add_publicer(request): if re ...
- django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)
models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True), OneToOneField("Author" ...
随机推荐
- NOIP 2016 迟来的满贯
17-03-22,雨 17-03-22,一个特别重要的日子 在这一天,本蒻攻克了NOIP 2016最难的一题,D1T2——天天爱跑步 实现了NOIP 2016的AK! YAYAYAYAYAYAY 自然 ...
- HDU 6212 Zuma 2017青岛网络赛 区间DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6212 解法:看了眼题就发现这个BZOJ 1032不是一毛一样?但是BZOJ上那是个巨坑,数据有错,原来 ...
- django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...
- Django 基于类的视图(CBV)执行流程 CBV 源码分析
一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...
- Django Xadmin - 重构django admin
一.Django admin的执行流程 https://www.cnblogs.com/weihengblog/p/9122509.html 我的博客,介绍了django admin执行流程 二.Xa ...
- 使用postman做接口测试(三)
三,接口用例的设计 个人感觉用例的设计才是重要的哈,网上查了一些资料总结了一下 1.业务流程测试 通过性验证: 1, 按照接口文档上的参数,正常传参,是否可以返回正确的结果 2, 是否满足前提条件,比 ...
- 缓存数据库-redis(管道)
一:Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常 ...
- makefile特殊符号介绍
http://blog.chinaunix.net/uid-20564848-id-217918.html makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$ ...
- nio复习总结
观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select epoll等 reactor: io事件触发时, ...
- wpf 在Popup内的TextBox 输入法 不能切换
切换输入法 输入不了中文 [DllImport("User32.dll")] public static extern IntPtr SetFocus(IntPtr hWnd); ...