之前说过为视图函数添加装饰器,同样我们也可以为类视图添加装饰器。比如,我们要实现在没有输入用户名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')),
]