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.类视图添加装饰器的主要内容,如果未能解决你的问题,请参考以下文章