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(login_required, name='dispatch')

class Profile_view(View):
    
    def get(self, request):
        return HttpResponse('个人中心')
    
    
    
    
    
    
因为在服务器接收到客户端发送过来的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.类视图添加装饰器)