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的流程

  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使用的是反射获取响应的函数


添加装饰器

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

第一步:

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")

posted @ 2019-09-17 20:56  Aries-X  阅读(518)  评论(0)    收藏  举报