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, reverse
from django.utils.decorators import method_decorator

<!--推荐:可以直接在类视图上直接使用 method_decorator方法为类视图的dispatch方法添加装饰器,这种方法相对简单-->
<!--并且在使用多个装饰器的时候,同样可以传递一个列表,列表中包含多个装饰器。-->

@ method_decorator(login_required, name='dispatch')
<!--name参数代表的是要在类视图的哪个函数上添加装饰器-->
class Profile_view(View):

    def get(self, request):
        return HttpResponse('个人中心')

    <!--不推荐:可以直接在dispatch方法上添加装饰器,但是这样的话,相对来说比较麻烦,因为还得重写dispatch方法-->
    <[email protected]_decorator(login_required)-->
    <!--def dispatch(request, *args, **kwargs):-->
    <!--    return super(Profile_view, self).dispatch(**kwargs)-->
    
因为在服务器接收到客户端发送过来的GET或POST请求之后,并不会立即执行该请求的方法,而是首先执行dispatch()方法,判断该请求的方法,之后才会执行get()或者是post()方法,所以在执行dispatch()方法的时候我们就要为该方法添加一个装饰器,将没有输入username访问个人中心页面的所有请求都返回login页面。实现的示例代码如下,均是在以上代码的基础上进行添加:
def login_required(fuc):
    def wrapper(request, *args, **kwargs):
        username = request.GET.get('username')
        if username:
            return fuc(request)
        else:
            return redirect(reverse('Profile:login'))

def login(request):
    return HttpResponse('success')

在app: Profile中的urls.py文件中进行视图函数与url的映射,示例代码如下:

from django.urls import path
from . import views
from .views import Profile_view

app_name = 'Profile'

urlpatterns = [
    path('', Profile_view.as_view()),
    path('login/', views.login, name='login'),
]

在项目的urls.py文件中再进行一层主url的映射,示例代码如下:

from django.urls import path, include

urlpatterns = [
    path('Profile/', include('Profile.urls')),
]

原文地址:https://www.cnblogs.com/guyan-2020/p/12306204.html

时间: 2024-10-12 11:17:08

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

类视图添加装饰器

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(r

类视图使用装饰器

#类视图使用装饰器 第一种方法在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