使用函数方式定义的视图叫函数视图,虽然使用方便,便于理解,但是当一个s视图有多种请求方式的时候,变需要使用分支来编写不同请求方式对应的逻辑。

使用函数视图,代码看上去是这样子的

def my_view(request):
if request.method == 'GET':
return HttpResponse("get")
if request.method == 'POST':
return HttpResponse("post")

1. 使用类视图

基于类的视图的核心是允许你用不同的实例方法来响应不同的HTTP请求方法,而不是在一个视图函数中使用条件分支代码来实现。

创建类视图

使用类视图,代码是这样子的

from django.views import View

class ClassView(View):

    def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

类视图需要继承django提供的 View 类,使用 from django.views import View 导入

注册路由

配置类视图的时候,使用类视图的 as_view 方法注册路由

urlpatterns = [
url(r'^class_view', views.ClassView.as_view(), name="class_view")
]

as_view 会返回类中一个方法的引用,它会到 View 中,执行 dispatch 方法, dispatch 会方法会在类中查找类似GET\POST之类的类方法,然后和请求方式进行匹配,匹配上了,就返回该方法的引用。

如果向上边的类视图发送一个 GET 请求,他会把 GET 转换为小写形式并和类中的方法进行匹配,然后匹配到 get 方法,会把 get 方法的引用返回到 as_view 调用处。所以在 get 请求下最后 as_viewget 方法的引用。

类视图使用装饰器

可以使用装饰器为类视图增加功能,使用装饰器有三种方式。

  • 在url配置中装饰
  • 在类视图中装饰
  • 使用Mixin扩展类

为了便于理解,使用下边的案例做演示

def decorator(func):
def wrapper(request, *args, **kwargs):
print('装饰器被调用')
return func(request, *args, **kwargs)
return wrapper class ClassView(View): def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

在url中装饰

url(r'^class_view', views.decorator(views.ClassView.as_view()), name="class_view")

发送 GET 或者 POST 类型请求打印结果

装饰器被调用

在url中调用该函数,并把 as_view 方法传入即可,这种方式会把所有被请求的函数都进行装饰。

这种方法把装饰放到了url配置中,不利于代码的完整性和可读性,所以一般情况下不使用。

在类视图中装饰

在类视图中使用装饰器不能直接装饰,需要使用 method_decorator 把装饰器转换位适用于类的装饰器。

在我们写的装饰器中,内层函数接收的参数为 request

def decorator(func):
def wrapper(request, *args, **kwargs):
print('装饰器被调用')
return func(request, *args, **kwargs)
return wrapper

而在类视图的方法中,第一个参数是 self ,所以要使用 method_decorator 把装饰器的第一个参数补充为 self 以使用类视图中的方法。

也可以手动为装饰器添加参数 self

def decorator(func):
def wrapper(self, request, *args, **kwargs):
print('装饰器被调用')
return func(self, request, *args, **kwargs)
return wrapper

装饰所有方法

可以重写并装饰类的 dispatch 方法,代码如下

class ClassView(View):

    @method_decorator(decorator)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

使用 GET 或者 POST 方式请求,都会执行装饰器,打印结果

装饰器被调用

只装饰某一个方法

class ClassView(View):

    @method_decorator(decorator)
def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

只有使用 GET 方式请求,才会执行装饰器,打印结果

装饰器被调用

POST 方式不会执行装饰器。

method_decorator 的 name 参数

装饰全部方法

@method_decorator(decorator, name="dispatch")
class ClassView(View): def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

指定被装饰的方法

@method_decorator(decorator, name="get")
class ClassView(View): def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

使用Mixin扩展类

扩展类使用了 Python 多继承的 MRO 特性。

class MyMixin(object):
@classmethod
def as_view(cls, *args, **kwargs):
view = super().as_view(*args, **kwargs)
view = decorator(view)
return view class ClassView(MyMixin, View): def get(self, request):
return HttpResponse("get") def post(self, request):
return HttpResponse("post")

这种方式会装饰所有方法,可以使用这种方式为方法添加多个装饰器。

django的类视图-11的更多相关文章

  1. 在DJANGO的类视图中实现登陆要求和权限保护

    以前接触的是基于函数的保护,网上材料比较多. 但基于类视图的很少. 补上! Decorating class-based views 装饰类视图 对于类视图的扩展并不局限于使用mixin.你也可以使用 ...

  2. Part 4:表单和类视图--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  3. 六、Django之表单和类视图-Part 4

    一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...

  4. django类视图简单使用和源码解析

    django的类视图,CBV: 我们在开始接触django的时候,习惯于使用函数编写视图,即FBV.使用FBV时,我们只需要在路由匹配时,对应的路由下找到这个函数就可以了,这样做看似很和谐,但是有的时 ...

  5. django中的类视图

    # 原创,转载请留言联系 当我们在开发一个注册模块时.浏览器会通过get请求让注册表单弹出来,然后用户输完注册信息后,通过post请求向服务端提交信息.这时候我们后端有两个视图函数,一个处理get请求 ...

  6. 补充01 Django 类视图

    视图 函数视图[Function Base View] 以函数的方式定义的视图称为函数视图,函数视图便于理解.但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不 ...

  7. django 类视图的使用

    使用django框架也有挺长时间了,但是一直都没有用过django的类视图,因为之前跟着网上教程学习时,觉得类视图是进阶的知识,可能目前还达不到吧 但今天在做项目的时候用到了,感觉真的太方便了吧,而且 ...

  8. 第 4 篇:用类视图实现首页 API

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 django-rest-framework 类视图拓展自 django 的类视图,只 ...

  9. Django内置的通用类视图

    1.ListView 表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性: model: 指定模型 te ...

随机推荐

  1. aix系统下的websphere的静默安装

     一:环境 aix5.3,websphere6(ND版本,WebSphereV6.1_for_AIX_64-bit_Support.tar),注意:aix和websphere的版本问题 二:安装 ...

  2. [WinCE | VS2008 | Solution] VS2008 building WinCE projects taking a long time

    1. Open C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2. Find pa ...

  3. C++发展概述、优缺点及应用领域

    个人观点(C++虽功能强大,但是底层还是调用C,C++为了吸引更多的C程序员,功能过于丰富且复杂,一定程度上反而降低了可编程的实用性.但是不可否认C++ 也是一门艺术.) C++是一门以C为基础发展而 ...

  4. Linux下安装Tomcat7

    一.Tomcat7软件包下载 Tomcat下载地址http://tomcat.apache.org/download-70.cgi 下载完成后, 将软件包apache-tomcat-7.0.82.ta ...

  5. Linux mount命令详解

    mount命令用于加载文件系统到指定的加载点.此命令的也常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命 ...

  6. SparkSql实现Mysql到hive的数据流动

    今天去面试了一波,因为调度系统采用了SparkSql实现数据从Mysql到hive,在这一点上面试官很明显很不满我对于Spark的理解,19年的第一个面试就这么挂了. 有问题不怕,怕的是知道了问题还得 ...

  7. 11g数据库查看dataguard是否同步

    一.环境      主库:       ip地址:192.168.122.203       oracle根目录:/data/db/oracle       SID:qyq       数据文件路径/ ...

  8. 使用ubuntu desktop是可能会用到的配置

    1.ubuntu desktop12.04 接双显示器 想要12.04版本在接上双显示器时能很好的工作,则需要进行如下设置: (1).编辑/etc/X11/xorg.conf文件: /etc/X11/ ...

  9. Echarts 多曲线“断点”问题解决方法

    Echarts 用来做可视化曲线是非常优秀的一个库.建议使用 Echarts 作为项目的可视化图标库时,仔细研究 官方实例,根据需求来选择类似的示例,下载实例模板来开发,节省时间,减少出错,提高效率. ...

  10. HNOI2018退役记

    不想记流水账了,总结一下考炸的原因吧.. $day1$: $12$点才知道$t3$怎么做. 可以用容斥+动态$dp$来搞,但是没时间写了. 事实上这个方法也比较复杂,标算比这优美多了. 所以还是想得太 ...