116.类视图添加装饰器

Posted guyan-2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方法-->
    <!--@method_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')),
]

以上是关于116.类视图添加装饰器的主要内容,如果未能解决你的问题,请参考以下文章

类视图添加装饰器

method_decorator的作用以及使用方法

基于类的视图和装饰器

python使用上下文对代码片段进行计时,非装饰器

类视图使用装饰器

Flask特殊装饰器