Django视图函数函数之视图装饰器

FBV模式装饰器:

  普通函数的装饰器(语法糖@)

  views.py

 1 from django.shortcuts import render
 2
 3 def wrapper(f):
 4     def inner(*args,**kwargs):
 5         print("before")
 6         ret=f(*args,**kwargs)
 7         print("after")
 8         return ret
 9     return inner
10
11 @wrapper
12 def index(request):
13     return render(request,"index.html") 

CBV模式装饰器:

    在CBV模式视图函数中必须先导入:from django.views import View

  (1)重写父类dispatch分发方法,在分发执行每个请求响应函数前后加上相应功能为实现类比装饰器

    views.py

 1 from django.shortcuts import render,HttpResponse
 2 from django.views import View
 3 from django.utils.decorators import method_decorator
 4
 5 class Myview(View):
 6
 7     def dispatch(self, request, *args, **kwargs):
 8         print("before")
 9         ret=super().dispatch(request, *args, **kwargs)
10         print("after")
11         return ret
12
13     def get(self, request):
14         return render(request, "login.html")
15
16     def post(self, request):
17         if request.method == "GET":
18             return render(request, "login.html")
19         elif request.method == "POST":
20             if request.POST.get("username") == "yang" and request.POST.get("userpsd") == "123":
21                 return render(request, "login_success.html", {"name": request.POST.get("username")})
22             else:
23                 return HttpResponse("账号或密码有误!")

  (2)在子类重写分发函数时加上装饰器(每个请求函数都会被装饰)

必须先导入:

from django.views import View

from django.utils.decorators import method_decorator

       views.py

 1 from django.shortcuts import render,HttpResponse
 2 from django.views import View
 3 from django.utils.decorators import method_decorator
 4
 5 def wrapper(f):
 6     def inner(*args,**kwargs):
 7         print("before")
 8         ret=f(*args,**kwargs)
 9         print("after")
10         return ret
11     return inner
12
13 class Myview(View):
14
15     @method_decorator(wrapper)
16     def dispatch(self, request, *args, **kwargs):
17         ret=super().dispatch(request, *args, **kwargs)
18         return ret
19
20     def get(self, request):
21         return render(request, "login.html")
22
23     def post(self, request):
24         if request.method == "GET":
25             return render(request, "login.html")
26         elif request.method == "POST":
27             if request.POST.get("username") == "yang" and request.POST.get("userpsd") == "123":
28                 return render(request, "login_success.html", {"name": request.POST.get("username")})
29             else:
30                 return HttpResponse("账号或密码有误!")

  3)在子类重写的不同响应请求函数上加上装饰器

必须先导入:

from django.views import View

from django.utils.decorators import method_decorator

views.py

 1 from django.shortcuts import render,HttpResponse
 2 from django.views import View
 3 from django.utils.decorators import method_decorator
 4
 5 def wrapper(f):
 6     def inner(*args,**kwargs):
 7         print("before")
 8         ret=f(*args,**kwargs)
 9         print("after")
10         return ret
11     return inner
12
13 class Myview(View):
14     # def dispatch(self, request, *args, **kwargs):
15     #     ret=super().dispatch(request, *args, **kwargs)
16     #     return ret
17
18     def get(self, request):
19         return render(request, "login.html")
20
21     @method_decorator(wrapper)
22     def post(self, request):
23         if request.method == "GET":
24             return render(request, "login.html")
25         elif request.method == "POST":
26             if request.POST.get("username") == "yang" and request.POST.get("userpsd") == "123":
27                 return render(request, "login_success.html", {"name": request.POST.get("username")})
28             else:
29                 return HttpResponse("账号或密码有误!")

  (4)在子类定义时加上装饰器,必须指定而且唯一指定加在的函数

必须先导入:

from django.views import View

from django.utils.decorators import method_decorator

views.py

 1 from django.shortcuts import render,HttpResponse
 2 from django.views import View
 3 from django.utils.decorators import method_decorator
 4
 5
 6 def wrapper(f):
 7     def inner(*args,**kwargs):
 8         print("before")
 9         ret=f(*args,**kwargs)
10         print("after")
11         return ret
12     return inner
13
14 @method_decorator(wrapper,name="post")
15
16 class Myview(View):
17     # def dispatch(self, request, *args, **kwargs):
18     #     ret=super().dispatch(request, *args, **kwargs)
19     #     return ret
20
21     def get(self, request):
22         return render(request, "login.html")
23
24     def post(self, request):
25         if request.method == "GET":
26             return render(request, "login.html")
27         elif request.method == "POST":
28             if request.POST.get("username") == "yang" and request.POST.get("userpsd") == "123":
29                 return render(request, "login_success.html", {"name": request.POST.get("username")})
30             else:
31                 return HttpResponse("账号或密码有误!")

  

其它装饰器:

·         添加装饰器前必须导入from django.utils.decorators import method_decorator

·         添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名

·         给类添加是必须声明name

·         注意csrf-token装饰器的特殊性,在CBV模式下它只能加在dispatch上面(后面再说)

下面这是csrf_token的装饰器:

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置csrfToken全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect

原文地址:https://www.cnblogs.com/open-yang/p/11221435.html

时间: 2024-11-05 23:26:40

Django视图函数函数之视图装饰器的相关文章

Day 19 函数之闭包、装饰器

一.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 三.高阶函数 高阶函数总结 1.函数接收的参数是一个函数名 作用:在不修改函数源代码的前提下,为函数添加新功能, 不足:会改变函数的调用方式 2.函数的返回值是一个函数名 作用:不修改函数的调用方式 不足:不能添加新功能 其.程序: work: #! /

闭包函数、无参装饰器2

一.闭包函数 闭包函数:函数内部定义函数,成为内部函数.该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数. name='alex' #定义全局变量name='alex' def func(): name='egon' #定义局部变量name='egon' def bar(): print(name) return bar #返回bar函数名 b=func() #执行func()结果为bar的函数名 相当于b=bar name='haha' #重新定义全局变量n

【函数】04、装饰器

一.高阶函数 python中函数是一等对象(first class):函数也是对象,并且它可以像普通对象一样复制.作为参数.作为返回值. 返回函数或者参数是函数的函数就是高阶函数,也被称为函数式编程 In [23]: def counter(base):     ...:     def inc(x=1):     ...:         nonlocal base     ...:         base += x     ...:         return base     ...:

函数的闭包和装饰器

函数的闭包: #1.闭 必须是内部的函数 #2.包 引用了外部作用域中的变量 命名空间: 一共有三种命名空间从大范围到小范围的顺序:内置命名空间.全局命名空间.局部命名空间 作用域(包括函数的作用域链): 小范围的可以用大范围的但是大范围的不能用小范围的范围从大到小(图) 在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推.如果都没有,报错 函数的嵌套: 嵌套调用 嵌套定义:定义在内部的函数无法直接在全局被调用 函数

Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 传入函数 函数的本身也可以作为参数. Python内建的mapreduce的函数.(来源于谷歌的,后来被道格这家伙开源了,成为当今处理大数据最火热的hadoop中的计算模型---MapReduce) 我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序

python 函数名 、闭包 装饰器 day13

1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print(func1) # <function func1 at 0x0000027B7CF1A048> 2,函数名的赋值 def func(): print(666) f = func print(f()) 3,函数名可以作为容器类数据的元素. def f1(): print(111) def f2()

python描述符、property、函数(类)装饰器实例解析

1 import sys 2 3 ''' 4 当使用实例对象访问属性时,都会调用__getattribute__内建函数 5 __getattribute__查找属性的优先级 6 1.类属性 7 2.数据描述符 8 3.实例属性 9 4.非数据描述符 10 5.__getattr__() 11 12 #实例.属性 13 c.x ==>type(x).__dict__['x'].__get__(x,type(x)) 14 #类.属性 15 C.x ==>X.__dict__['x'].__get

python基础之函数进阶之函数作为返回值/装饰器

因为装饰器需要用到返回函数的知识,所以在这里将返回函数和装饰器合并讲解. 什么是返回函数? 我们知道,一个函数中return可以返回一个或者多个值,但其实,return不仅可以返回值,还可以返回函数. 实例: def col(*arg): def sum(): res_sum=0 for i in arg: res_sum=res_sum+i return res_sum return sum a=col(1,2,3,4,5) print(a)<function col.<locals>

闭包函数、无参装饰器

闭包函数:函数内部定义函数,成为内部函数.该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数. name='alex' #定义全局变量name='alex' def func(): name='egon' #定义局部变量name='egon' def bar(): print(name) return bar #返回bar函数名 b=func() #执行func()结果为bar的函数名 相当于b=bar name='haha' #重新定义全局变量name='ha

【函数】06、装饰器的应用

1.写一个装饰器,实现缓存功能,允许过期,但没有换出,没有清除 1)cache的必要元素:key --> value 这里的key是函数的参数,value是函数的返回值 2)超时时间 超时时间如何存储 步骤1: In [28]: from functools import wraps In [29]: def cache(fn):     ...:     cache_dict = {}     ...:     @wraps                          ...: