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

  • 相关阅读:
    LG P4449 & JZOJ 于神之怒
    [国家集训队]Crash的数字表格
    LG P3768 简单的数学题
    NOI2018 屠龙勇士
    为什么从后台获取的id到前端后却变了?Long类型转json时前端js丢失精度解决方案-----@JsonSerialize和@JsonDeserialize
    vue的filters过滤器优化
    根据key查询redis中是否存在key对应的value,根据key获取值
    PowerDesigner逆向工程将MYSQL数据库转成pdm
    解决图片验证码不显示的问题
    报错:Unknown column 'province' in 'field list'
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11619791.html
Copyright © 2011-2022 走看看