类视图添加装饰器

from django.utils.decorators import method_decorator

1. 加在CBV视图的get或post方法上

 1 from django.utils.decorators import method_decorator
 2
 3
 4 class HomeView(View):
 5
 6     def dispatch(self, request, *args, **kwargs):
 7         return super(HomeView, self).dispatch(request, *args, **kwargs)
 8
 9     def get(self, request):
10         return render(request, "home.html")
11
12     @method_decorator(check_login)
13     def post(self, request):
14         print("Home View POST method...")
15         return redirect("/index/")

2. 加在dispatch方法上

 1 from django.utils.decorators import method_decorator
 2
 3
 4 class HomeView(View):
 5
 6     @method_decorator(check_login)
 7     def dispatch(self, request, *args, **kwargs):
 8         return super(HomeView, self).dispatch(request, *args, **kwargs)
 9
10     def get(self, request):
11         return render(request, "home.html")
12
13     def post(self, request):
14         print("Home View POST method...")
15         return redirect("/index/")

因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。

3. 直接加在视图类上,但method_decorator必须传 name 关键字参数

如果get方法和post方法都需要登录校验的话就写两个装饰器。

 1 from django.utils.decorators import method_decorator
 2
 3 @method_decorator(check_login, name="get")
 4 @method_decorator(check_login, name="post")
 5 class HomeView(View):
 6
 7     def dispatch(self, request, *args, **kwargs):
 8         return super(HomeView, self).dispatch(request, *args, **kwargs)
 9
10     def get(self, request):
11         return render(request, "home.html")
12
13     def post(self, request):
14         print("Home View POST method...")
15         return redirect("/index/")

CSRF Token相关装饰器在CBV只能加到dispatch方法上,或者加在视图类上然后name参数指定为dispatch方法。

备注:

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

     1 from django.views.decorators.csrf import csrf_exempt, csrf_protect
     2 from django.utils.decorators import method_decorator
     3
     4
     5 class HomeView(View):
     6
     7     @method_decorator(csrf_exempt)
     8     def dispatch(self, request, *args, **kwargs):
     9         return super(HomeView, self).dispatch(request, *args, **kwargs)
    10
    11     def get(self, request):
    12         return render(request, "home.html")
    13
    14     def post(self, request):
    15         print("Home View POST method...")
    16         return redirect("/index/")

    或者:

     1 from django.views.decorators.csrf import csrf_exempt, csrf_protect
     2 from django.utils.decorators import method_decorator
     3
     4
     5 @method_decorator(csrf_exempt, name=‘dispatch‘)
     6 class HomeView(View):
     7
     8     def dispatch(self, request, *args, **kwargs):
     9         return super(HomeView, self).dispatch(request, *args, **kwargs)
    10
    11     def get(self, request):
    12         return render(request, "home.html")
    13
    14     def post(self, request):
    15         print("Home View POST method...")
    16         return redirect("/index/")

原文地址:https://www.cnblogs.com/wen-kang/p/9615542.html

时间: 2024-10-07 22:13:12

类视图添加装饰器的相关文章

116.类视图添加装饰器

之前说过为视图函数添加装饰器,同样我们也可以为类视图添加装饰器.比如,我们要实现在没有输入用户名username=xxx时,返回给用户登录的login页面,如果进行传入了?username=xxx,就可以进入个人中心页面,views.py文件中示例代码如下: from django.http import HttpResponse from django.views.generic import View from django.shutcuts import render, redirect,

类视图使用装饰器

#类视图使用装饰器 第一种方法在urls文件中设置路由视图方法时导入装饰器方法 path('/cartlist',check_login(CartList.as_view())), 第二种方法 导入模块 from django.utils.decorators import method_decorator name='get' 指定装饰get方法 @method_decorator(check_login,name='get') 原文地址:https://www.cnblogs.com/Niu

python_如何在类中定义装饰器

案例: 实现一个能将函数调用信息记录到日志的装饰器 需求: 把每次函数的调用时间,执行时间,调用次数写入日志 可以对被装饰函数分组,调用信息记录到不同日志 动态修改参数,比如日志格式 动态打开关闭日志输出功能 如何解决这个问题? 为了装饰器的灵活性,定义一个装饰类,把这个类的实例方法当做装饰器,在类中装饰器方法持有实例对象,便于修改属性和扩展功能 #!/usr/bin/python3 import logging from time import time, strftime, localtim

python 装饰器 四 (带有类参数的装饰器)

#!/usr/bin/env python#_*_coding=utf-8_*_#Author: xieyixue#mail: [email protected]#Created Time: 2015年07月01日 星期三 01时30分36秒 class staticClass: def __init__(self): print "初始化" @staticmethod def before(): print "before" @staticmethod def a

生成器的进阶,关于send()方法的使用,以及为生成器添加装饰器

def generator(): print(12) num=yield 12 print("**",num) print(52) yield 445 g=generator()#把这个函数传给g,变成一个生成器 ret=g.__next__() print(ret) ret=g.send("hello")#它的效果和__next__相同,在读取下一步内容的同时,给上个yield传个值 print(ret) #send()使用的注意事项 1.第一次使用生成器的时候,

Django框架的使用教程--类视图-中间间-模板[六]

类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, request): return render(request, 'index.html') def post(self, request): return render(request, 'show.html') 路由 url(r'^class_view/$', views.class_view.as_view()),

(django)11类视图

目录 1. 使用类视图 创建类视图 注册路由 类视图使用装饰器 在url中装饰 在类视图中装饰 method_decorator 的 name 参数 使用Mixin扩展类 使用函数方式定义的视图叫函数视图,虽然使用方便,便于理解,但是当一个s视图有多种请求方式的时候,变需要使用分支来编写不同请求方式对应的逻辑. 使用函数视图,代码看上去是这样子的 def my_view(request): if request.method == 'GET': return HttpResponse("get&

Javascript装饰器的妙用

最近新开了一个Node项目,采用TypeScript来开发,在数据库及路由管理方面用了不少的装饰器,发觉这的确是一个好东西.装饰器是一个还处于草案中的特性,目前木有直接支持该语法的环境,但是可以通过 babel 之类的进行转换为旧语法来实现效果,所以在TypeScript中,可以放心的使用@Decorator. 什么是装饰器 装饰器是对类.函数.属性之类的一种装饰,可以针对其添加一些额外的行为.通俗的理解可以认为就是在原有代码外层包装了一层处理逻辑.个人认为装饰器是一种解决方案,而并非是狭义的@

Django 通用类视图

引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: from django.urls import path from django.views.generic import TemplateView urlpatterns = [ path('about/', TemplateView.as_view(template_name="about.h