给FBV加装饰器

FBV:function based view

FBV本身就是一个函数,所以跟普通函数加装饰器是一样的

  1. # 装饰函数是要在APP文件中定义,本例是在app01\templatetags\tag.py中进行定义
  2. def wrapper(func):
  3. def inner(*args,**kwargs):
  4. start_time = time.time()
  5. ret = func(*args, **kwargs)
  6. end_time = time.time()
  7. print("last:",end_time - start_time)
  8. return ret
  9. return inner
  10. # 给FBV加装饰器
  11. from app01.templatetages import tags
  12. @tags.wrapper
  13. def jjzz(request):
  14. if request.method == "get":
  15. return render(request,"jjzz.html")

给CBV加装饰器

CBV:class based view

CBV简述

使用CBV的方式写一个GET请求view

  1. # 在views中定义CBV
  2. from django.shortcuts import render,HttpResponse,redirect
  3. from django.views import View
  4. class Index(View): # view是必须加的
  5. def get(self,request):
  6. return render(request,"jjzz.html")

​ Django项目中urls的目的是将一个request分配给一个可调用的函数,而不是一个class类。而通过CBV进行请求处理时,CBV提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后再通过实例对象去调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request

  1. # 在urls中进行路由设置
  2. from app01 import views
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^jjzz/', views.Index.as_view()),
  6. ]

CBV类的属性可以通过两种方式设置,一是比较常用的直接在类中定义;二是通过urls指定类的属性

  1. # 方式一:
  2. class Index(View):
  3. jjzz = "叽叽喳喳的世界"
  4. def get(self,request):
  5. return render(request,"jjzz.html")
  6. # 方式二:
  7. from app01 import views
  8. urlpatterns = [
  9. url(r'^admin/', admin.site.urls),
  10. url(r'^jjzz/', views.Index.as_view()),
  11. # url(r'^jjzz/', views.Index.as_view(jjzz="hello world")),
  12. ]

CBV的流程

  1. 项目启动,运行urls.py,执行 views.Index.as_view() ,传给view()函数

  2. 当view()接受到请求时,执行 view()函数

    • 实例化自定义的类,本例是Index,view中的self就是Index本身
    • self.request = request,将request传给self.request
    • 执行view()中的self.dispatch(request, *args, **kwargs),调用dispatch()函数
  3. dispatch()函数

    • 判断请求是否被允许,如果允许,通过反射获取请求方式对应的方法并传给handler;如果不允许,则将将self.http_method_not_allowed 传给handler
    • 执行handler,获取到响应,handler使用的是反射获取响应的函数





添加装饰器

类中的方法与独立的函数不完全相同,因此不能直接给类函数加装饰器,必要的条件是将函数装饰器转为方法装饰器。

第一步:

  1. from django.utils.decorators import method_decorator

第二步:

  1. from django.utils.decorators import method_decorator
  2. from app01.templatetages import tags
  3. # 方式一:直接加在方法上
  4. class Index(View):
  5. @method_decorator(tags.wrapper)
  6. def get(self,request):
  7. return render(request,"jjzz.html")
  8. -------------------------------------------------------------------------
  9. # 方式二:加在dispatch函数上
  10. class Index(View):
  11. # 自己写dispatch方法
  12. @method_decorator(tags.wrapper)
  13. def dispatch(self, request, *args, **kwargs):
  14. # 可在此添加功能
  15. ret = super().dispatch(request, *args, **kwargs)
  16. # 可在此添加功能
  17. return ret
  18. def get(self, request):
  19. return render(request, "jjzz.html")
  20. # 自己不写dispatch,推荐使用
  21. @method_decorator(tags.wrapper, name='dispatch')
  22. class Index(View):
  23. -------------------------------------------------------------------------
  24. # 方式三:加在类上,不推荐使用
  25. @method_decorator(tags.wrapper, name='post')
  26. @method_decorator(tags.wrapper, name='get')
  27. class Index(View):
  28. def get(self,request):
  29. return render(request,"jjzz.html")
  30. def post(self,request):
  31. return render(request,"jz.html")

Django-给视图加装饰器的更多相关文章

  1. Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传

    Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV       在Django中存 ...

  2. django类视图的装饰器验证

    django类视图的装饰器验证 django类视图的get和post方法是由View内部调用dispatch方法来分发,最后调用as_view来完成一个视图的流程. 函数视图可以直接使用对应的装饰器 ...

  3. Django基础之给视图加装饰器

    1. 使用装饰器装饰FBV FBV本身就是一个函数,所以和给普通的函数加装饰器无差: def wrapper(func): def inner(*args, **kwargs): start_time ...

  4. django ----CBV中加装饰器

    CBV中加装饰器 from django import views from django.utils.decorators import method_decorator def login_aut ...

  5. Django中类视图使用装饰器的方式

    类视图使用装饰器 为类视图添加装饰器,可以使用两种方法. 为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图. def ...

  6. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  7. Django:(05)类视图,装饰器和中间件

    一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ...

  8. CBV加装饰器解决登录注册问题和 <<中间件>>

    文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...

  9. django 内置用户-装饰器

    """ 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...

随机推荐

  1. Wuss Weapp 微信小程序 UI 组件库

    微信小程序 UI 组件库 Github地址 https://github.com/phonycode/wuss-weapp 文档 https://phonycode.github.io/wuss-we ...

  2. [旧版] CASthesis 模板编译的问题

    写在前面的话:国科大最新版的模板在这里(https://github.com/mohuangrui/ucasthesis),利用它来写博后出站报告的相关介绍在这里: 本篇博文是针对另一个模板进行介绍的 ...

  3. yii学习笔记(四)

    return $this->goBack(); // 先看看Yii::$app->user->returnUrl是否已经设置, returnUrl没有设置且goBack()中的参数也 ...

  4. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)D

    题面 一开始想到一个 O(N^2) 做法,先把x排序,然后顺次枚举x最大的点,看向前最多可以保留多少点 (也就是先不管正方形的上下长度限制,先考虑左右的限制).然后再对这些点做一遍类似的..(等等这么 ...

  5. Asteroids POJ - 3041

    Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...

  6. 洛谷 P1341 无序字母对(欧拉路)

    P1341 无序字母对 题目提供者yeszy 标签 福建省历届夏令营 难度 提高+/省选- 最新讨论 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造 ...

  7. Catch That Cow (POJ - 3278)(简单BFS)

    转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82693928作者:Mercury_Lc 题目链接 题解:给你x.y,x可以加1.减 ...

  8. Java web 简单的增删改查程序(超详细)

    就是简单的对数据进行增删改查.代码如下: 1.bean层:用来封装属性及其get set方法 toString方法,有参构造方法,无参构造方法等. public class Bean { privat ...

  9. AcWing:149. 荷马史诗(哈夫曼编码 + k叉哈夫曼树)

    追逐影子的人,自己就是影子. ——荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和<伊 ...

  10. Vue_(组件)实例属性

    Vue实例属性与方法中文文档 传送门   Vue实例属性:vue实例直接调用的属性 Learn 一.vm.$data:获取属性 二.vm.$el:获取实例挂载的元素 三.vm.$options:获取自 ...