zoukankan      html  css  js  c++  java
  • Django-给视图加装饰器

    给FBV加装饰器

    FBV:function based view

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

    # 装饰函数是要在APP文件中定义,本例是在app01	emplatetags	ag.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")
    

  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11619791.html
Copyright © 2011-2022 走看看