- 在django项目中,我们需要验证权限等,使用django封装的不能够准确的提醒用户是缺少什么权限,所以我们就可以使用装饰器在视图上来进行权限管理
- 装饰器的原理:闭包,在函数内部定义一个函数,并且这个函数用到了外部函数的变量,那么将这个函数以及用到的变量称之为闭包
- 视图代码:
from django.utils.decorators import method_decorator
from users.decorator import set_func, DecoratorClass
class DecoratorAPIView(GenericAPIView):
"""装饰器实验"""
authentication_classes = []
@method_decorator(DecoratorClass)
def get(self, request, *args, **kwargs):
print('我进来了了')
if hasattr(request, 'message'):
return APIResponse.success(data=[], message=request.message)
return APIResponse.success(data=[], message='OK')
- 装饰器代码:
from django.contrib.auth.models import AnonymousUser
def set_func(func):
"""权限校验"""
def call_func(request, *args, **kwargs):
print('我是权限校验')
user = request.user
if isinstance(user, AnonymousUser):
request.message = '请登陆后访问!'
return func(request, *args, **kwargs)
if user.role == '初级管理员':
request.message = '您没有权限!'
return func(request, *args, **kwargs)
return func(request, *args, **kwargs)
return call_func
class DecoratorClass(object):
"""使用类装饰器来权限校验"""
def __init__(self, func):
self.func = func
def __call__(self, request, *args, **kwargs):
print('我是类权限校验')
user = request.user
if isinstance(user, AnonymousUser):
request.message = '请登陆后访问........'
return self.func(request, *args, **kwargs)
if user.role == '初级管理员':
request.message = '您没有权限!'
return self.func(request, *args, **kwargs)
return self.func(request, *args, **kwargs)
@set_func
def deftest(request, *args, **kwargs):
print(request)
@DecoratorClass
def classtest(request, *args, **kwargs):
print(request)
if __name__ == "__main__":
deftest(10)
classtest(10)
- 结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210509103056500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODc0NjM1,size_16,color_FFFFFF,t_70#pic_center)