Django-给视图加装饰器
给FBV加装饰器
FBV:function based view
FBV本身就是一个函数,所以跟普通函数加装饰器是一样的
# 装饰函数是要在APP文件中定义,本例是在app01\templatetags\tag.py中进行定义
def wrapper(func):
def inner(*args,**kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
print("last:",end_time - start_time)
return ret
return inner
# 给FBV加装饰器
from app01.templatetages import tags
@tags.wrapper
def jjzz(request):
if request.method == "get":
return render(request,"jjzz.html")
给CBV加装饰器
CBV:class based view
CBV简述
使用CBV的方式写一个GET请求view
# 在views中定义CBV
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
class Index(View): # view是必须加的
def get(self,request):
return render(request,"jjzz.html")
Django项目中urls的目的是将一个request分配给一个可调用的函数,而不是一个class类。而通过CBV进行请求处理时,CBV提供了一个as_view()
静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后再通过实例对象去调用dispatch()
方法,dispatch()
方法会根据request的method的不同调用相应的方法来处理request
# 在urls中进行路由设置
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/', views.Index.as_view()),
]
CBV类的属性可以通过两种方式设置,一是比较常用的直接在类中定义;二是通过urls指定类的属性
# 方式一:
class Index(View):
jjzz = "叽叽喳喳的世界"
def get(self,request):
return render(request,"jjzz.html")
# 方式二:
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/', views.Index.as_view()),
# url(r'^jjzz/', views.Index.as_view(jjzz="hello world")),
]
CBV的流程
项目启动,运行urls.py,执行
views.Index.as_view()
,传给view()函数当view()接受到请求时,执行 view()函数
- 实例化自定义的类,本例是Index,view中的self就是Index本身
- self.request = request,将request传给self.request
- 执行view()中的self.dispatch(request, *args, **kwargs),调用dispatch()函数
dispatch()函数
- 判断请求是否被允许,如果允许,通过反射获取请求方式对应的方法并传给handler;如果不允许,则将将self.http_method_not_allowed 传给handler
- 执行handler,获取到响应,handler使用的是反射获取响应的函数
添加装饰器
类中的方法与独立的函数不完全相同,因此不能直接给类函数加装饰器,必要的条件是将函数装饰器转为方法装饰器。
第一步:
from django.utils.decorators import method_decorator
第二步:
from django.utils.decorators import method_decorator
from app01.templatetages import tags
# 方式一:直接加在方法上
class Index(View):
@method_decorator(tags.wrapper)
def get(self,request):
return render(request,"jjzz.html")
-------------------------------------------------------------------------
# 方式二:加在dispatch函数上
class Index(View):
# 自己写dispatch方法
@method_decorator(tags.wrapper)
def dispatch(self, request, *args, **kwargs):
# 可在此添加功能
ret = super().dispatch(request, *args, **kwargs)
# 可在此添加功能
return ret
def get(self, request):
return render(request, "jjzz.html")
# 自己不写dispatch,推荐使用
@method_decorator(tags.wrapper, name='dispatch')
class Index(View):
-------------------------------------------------------------------------
# 方式三:加在类上,不推荐使用
@method_decorator(tags.wrapper, name='post')
@method_decorator(tags.wrapper, name='get')
class Index(View):
def get(self,request):
return render(request,"jjzz.html")
def post(self,request):
return render(request,"jz.html")
Django-给视图加装饰器的更多相关文章
- Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传
Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV 在Django中存 ...
- django类视图的装饰器验证
django类视图的装饰器验证 django类视图的get和post方法是由View内部调用dispatch方法来分发,最后调用as_view来完成一个视图的流程. 函数视图可以直接使用对应的装饰器 ...
- Django基础之给视图加装饰器
1. 使用装饰器装饰FBV FBV本身就是一个函数,所以和给普通的函数加装饰器无差: def wrapper(func): def inner(*args, **kwargs): start_time ...
- django ----CBV中加装饰器
CBV中加装饰器 from django import views from django.utils.decorators import method_decorator def login_aut ...
- Django中类视图使用装饰器的方式
类视图使用装饰器 为类视图添加装饰器,可以使用两种方法. 为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图. def ...
- Django CBV加装饰器、Django中间件、auth模块
一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...
- Django:(05)类视图,装饰器和中间件
一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ...
- CBV加装饰器解决登录注册问题和 <<中间件>>
文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...
- django 内置用户-装饰器
""" 一.如何给python内置用户添加额外的字段,注意一定义在没有迁移数据之前定义,否则会报错 1.在models中先调用 from django.contrib.a ...
随机推荐
- Linux下DB2指令总结
1.显示当前实例 >> get instance The current database manager instance is: db2axing 2.列出当前实例中激活的数据库 &g ...
- 帝都之行9day:正式上班第一天
今天是我正式上班的第一天. 面了两天,三家公司,然后周五就去办入职了,我是不是太随便了点,捂脸. 不管怎么说,又要开始上班啦,CRUD的日子又要开始了…… 加油吧!
- MySQL 关于索引的操作
-- 索引分类? 1.普通索引 2.唯一索引 3.全文索引 4.组合索引 普通索引:仅加速查询,最基本的索引,没有任何限制 唯一索引:加速查询 + 列值唯一(可以有null) 全文索引:仅适用于MyI ...
- Hadoop-No.6之文件在HDFS中的位置
在设计一种HDFS模式时,首先应该决定文件的位置.标准化的位置会使得团队之间更容易查找和共享数据. 推荐HDFS目录结构实例.目录结构简化了不同组和用户的权限分配 /user/{username} 只 ...
- 2g 大文件上传
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- 灰度图像--图像分割 霍夫变换(Hough Transform)--直线
学习DIP第50天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://gi ...
- Python与开源GIS
https://www.osgeo.cn/pygis/ 这里列出了与 GIS 相关的 Python 开源类库与工具. 基础类库(抽象库) • GDAL/OGR 是大部分开源GIS的基础,也包括如Arc ...
- Fire Game (FZU 2150)(BFS)
题解:一开始想错了,以为只要烧完就是那个答案,但是这不是最优的结果,需要每两个点都bfs一遍,找到如果能够全部烧完,找到花费时间最小的,如果不能return -1.在bfs的时候,记录答案的方法参考了 ...
- SpringMVC——入门
一.SpringMVC介绍: Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请 ...
- Java线程之FutureTask
简述 FutureTask是Future接口的实现类,并提供了可取消的异步处理的功能,它包含了启动和取消(start and cancel)任务的方法,同时也包含了可以返回FutureTask状态(c ...