类视图

  • 以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
  • 在Django中也可以使用类来定义一个视图,称为类视图。使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。

方式一

def my_decorator(func):"""自定义的装饰器"""def wrapper(request,*args,**kwargs):print("自动以装饰器被调用了")print("请求路径为: %s" % request.path)return func(request, *args, **kwargs)return wrapperclass DemoView(View):"""第一种方法"""# 装饰了dsipasth方法就可以实现两个函数的装饰,dsipasth是as_view函数的一个内部函数@method_decorator(my_decorator)def dispatch(self, *args, **kwargs):return super().dispatch(*args, **kwargs)def get(self,request):print("get 方法")return  HttpResponse("get page")def post(self,request):print("post 方法")return  HttpResponse("post page")

urls文件中要使用as_view()将类转化成视图

url("demo1",DemoView.as_view()),

方式二

def my_decorator(func):"""自定义的装饰器"""def wrapper(request,*args,**kwargs):print("自动以装饰器被调用了")print("请求路径为: %s" % request.path)return func(request, *args, **kwargs)return wrapper"""
method_decorator装饰器还支持使用name参数指明被装饰的方法
method_decorator有两个参数,一个是装饰器的名字第二用name指定被装饰的函数
"""# @method_decorator(my_decorator, name='get') # 为特定请求方法添加装饰器
@method_decorator(my_decorator,name="dispatch") # 为全部请求方法添加装饰器
class DemoVeiw2(View):"""第二种方法"""def get(self,request):print("get 方法")return  HttpResponse("get page")def post(self,request):print("post 方法")return  HttpResponse("post page")

urls文件中要使用as_view()将类转化成视图

  url("demo2",DemoVeiw2.as_view()),

方式三

def my_decorator(func):"""自定义的装饰器"""def wrapper(request,*args,**kwargs):print("自动以装饰器被调用了")print("请求路径为: %s" % request.path)return func(request, *args, **kwargs)return wrapperdef my_decorator3(func):def wrapper(self, request, *args, **kwargs):  # 此处增加了selfprint('自定义装饰器被调用了')print('请求路径%s' % request.path)return func(self, request, *args, **kwargs)  # 此处增加了selfreturn wrapper"""
函数视图准备的装饰器,其被调用时,第一个参数用于接收request对象
而类视图中请求方法被调用时,传入的第一个参数不是request对象,而是self 视图对象本身,第二个位置参数才是request对象
method_decorator的作用是为函数视图装饰器补充第一个self参数,以适配类视图方法。
如果将装饰器本身改为可以适配类视图方法的,类似如下,则无需再使用method_decorator。
"""class DemoVeiw3(View):"""第三种方法"""@my_decorator3  # 装饰dispatch就可以全部装饰def dispatch(self, *args, **kwargs):return super().dispatch(*args, **kwargs)def get(self,request):print("get 方法")return  HttpResponse("get page")def post(self,request):print("post 方法")return  HttpResponse("post page")

urls文件中要使用as_view()将类转化成视图

url("demo3",DemoView.as_view()),

方式四(Minxin扩展类)

"""
Minxin扩展类
"""def my_decorator4(func):"""自定义装饰器"""def wrapper(request, *args, **kwargs):  # 此处增加了selfprint('自定义装饰器被调用了')print('请求路径%s' % request.path)return func(request, *args, **kwargs)  # 此处增加了selfreturn wrapper# 程序员中不成文规定,扩展类类名使用Minxin结尾
class MyDecoratorMinxin(object):"""构造Minxin扩展类"""@classmethoddef as_view(cls, *args, **kwargs):view = super().as_view(*args, **kwargs)view = my_decorator4(view)return view"""
实际工作中会有不止一个的扩展类,所以使用多继承的必然的,
这些扩展类都集成自object,但是object中并没有as_view方法,
所以在一个类要集成扩展类达到装饰目的时一定要在最后继承View类进行兜底
"""class DemoVeiw4(MyDecoratorMinxin,View):  # 多继承,最后继承View类进行兜底"""第四种方法"""def get(self,request):print("get 方法")return  HttpResponse("get page")def post(self,request):print("post 方法")return  HttpResponse("post page")

urls文件中要使用as_view()将类转化成视图

url("demo4",DemoView.as_view()),

Django中类视图的几实现方式相关推荐

  1. Django中类视图ListView和DetailView的使用

    我们在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑.最终的目的都是一样的. 比如博客,通常其首页都是文章列表以及siderbar里的文章分类.推荐阅读.标签等等. 对处理首 ...

  2. django之视图系统 views.py--主要内容(FBV和CBV、dispath、request对象和request.FILES、JsonResponse)...

    django之视图系统 views.py-->主要内容(FBV和CBV.dispath.request对象和request.FILES.JsonResponse) 一个视图函数(类),简称视图, ...

  3. Django的视图层简介

    Django的视图层 视图函数 所谓视图函数,其实就是我们Django项目中各个应用中的views.py文件中定义的每个用来处理URL路由映射到这里的逻辑函数.一个视图函数简称视图,它是个简单的Pyt ...

  4. Django的视图函数(二):request对象、视图函数返回值(HTML响应、JsonResponse)、反向解析(视图函数)、HttpResponse子类

    文章目录 一.request对象 1.概念 2.属性 (1)path (2)method (3)GET (4)POST (5)encoding (6)META 二.视图函数的返回值 1.HTML响应 ...

  5. django 类视图装饰器_灵活视图处理的模式,第2部分–使用装饰器

    django 类视图装饰器 For years, we've been so busy discussing the virtues and drawbacks of the model/contro ...

  6. django通用视图(视图类)的login登陆、权限限定

    django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...

  7. 【7】Django网页视图模板处理

    天下难事必作於易.天下大事必作於细.是以圣人终不为大,故能成其大 --老子<道德经> 本节内容 HTML页面的渲染 使用页面模板 异常处理 超链接路径处理 路由命名空间 1. HTML页面 ...

  8. django通用视图(CBV)

    1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...

  9. Django框架视图类

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

最新文章

  1. 说得太好了!阿里巴巴为什么不用 ZooKeeper 做服务发现?
  2. CSS如何正确显示人民币符号¥
  3. iOS关于Xcode上的Other linker flags
  4. C++及Windows异常处理(try,catch; __try,__finally; __try, __except)——一道笔试题引起的探究
  5. linux中快速查找文件
  6. win10系统安装Redis3.2.100
  7. (3)段描述符,段选择子,LES指令
  8. 如何在Appscale下发布自己的应用(二)
  9. 理解T-SQL: 触发器
  10. 【高项】第4章 项目整体管理与变更管理【知识点精华笔记】
  11. 80% 应聘者都不及格的 JS 面试题
  12. 两个月的一些工作总结
  13. bat自动输入密码_如何给电脑文件夹设置密码?一学就会
  14. c语言weak void,浅尝辄止5-C语言-weak symbol
  15. 【亲自动手试验过的】硬盘免光驱安装Fedora5
  16. NOIP2015提高组 信息传递(图论)
  17. 如何理解statsmodels.ols的输出结果?ols计算的线性回归结果以及手动计算的结果的对比
  18. linux 时区设置 美国西部,美国西部太平洋时区是几区?
  19. 哈工大-计算机系统-2022 | 大作业
  20. springboot 转换为金额大写工具类

热门文章

  1. vi查找和替换字符串
  2. redis2.2.8版本的安装详情
  3. 用 S5PV210 学习 Linux (一) 刷机(一)
  4. ViewPager与Tab结合使用
  5. centOS 6.0无法运行dump指令的解决方法
  6. JDDroppableView
  7. “Chrome不能访问更新服务器(错误:3)”的解决方法
  8. npm使用国内镜像加速的几种方法
  9. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 个性化推荐
  10. Docker快速搭建Bugzilla