在解释什么是装饰器之前,先说说什么是闭包Closure:一个内层函数定义在一个外层函数中内层函数使用外层函数的临时变量外层函数的返回值是对内层函数的引用functiondefouter():a=100definner():b=a+100print(b)returninnerouter()()装饰器:以@开头,装饰器是函数调用之上的装饰器,在不改变原有的基础上代码,添加一些额外的功能。装饰器使用场景授权:装饰器可以帮助检查某人是否被授权使用Web应用程序端点(endpoint)。它们广泛用于Flask和Django网络框架中。日志记录:在记录日志的地方添加装饰器缓存:通过装饰器获取缓存中的值函数装饰器装饰器:defouter(func):definner(a,b)/definner(*args,**kwargs):print("执行特殊验证函数")func(a,b)/func(*args,**kwargs)print("停止执行")returninner@outerdeff(a,b):print("a+b=",(a+b))f(10,20)#输出结果:执行特效函数30停止执行多个装饰器:start:top-downBottomend:bottom-updefouter1(func):definner(a,b)/definner(*args,**kwargs):print("执行特殊验证函数1")print("111111111111")func(a,b)/func(*args,**kwargs)print("1停止执行")print("111111111111")returninnerdefouter2(func):definner(a,b)/definner(*args,**kwargs):print("执行特殊函数2")print("222222222222")func(a,b)/func(*args,**kwargs)print("2停止执行")print("222222222222")returninner@outer1@outer2deff(a,b):print("a+b=",(a+b))f(10,20)输出分辨率终极:执行特殊功能校验111111111111执行特殊功能校验2222222222222302停止执行2222222222221停止执行111111111111类装饰器的使用这里的代码展示了jwt和类装饰器的结合目的:防止用户篡改其他人的敏感信息importjwtdecoratordefmy_decorator(func):defwrapper(request,*args,**kwargs):print('这个装饰器已经被调用')print('请求接口地址为%s'%request.path)判断jwt逻辑uid=request.GET.get("uid")clinet_jwt=request.GET.get("jwt",None)如果clinet_jwt为None:returnHttpResponse('Notoken')decode_jwt=jwt.decode(clinet_jwt,'123',algorithms=['HS256'])ifdecode_jwt['uid']!=str(uid):returnHttpResponse('你篡改了用户id')returnfunc(request,*args,**kwargs)returnwrapper类装饰器调用自django.utils.decoratorsimportmethod_decorator调用用户信息类UserInfo(APIView):@method_decorator(my_decorator)defget(self,request):uid=request.GET.get('uid')查询数据user=User.objects.get(id=int(uid))序列化对象user_ser=UserSer(user)returnResponse(user_ser.data)登录接口类Login(APIView):defget(self,request):接收参数username=request.GET.get('username','notreceived')password=request.GET.get('password','notreceived')查询数据user=User.objects.filter(username=username,password=make_password(password)).first()ifuser:res={}res['code']=200res['message']='登录成功'res['username']=user.usernameres['uid']=user.id加入jwt编码机制编码智汇代理应用http://www.kaifx.cn/broker/th...encode_jwt=jwt.encode({'uid':str(user.id)},'123',algorithm='HS256')解码操作强制encode_str=encode_jwt.decode('utf-8')res['jwt']=encode_strreturnResponse(res)else:res={}res['code']=405res['message']='用户名或密码错误'returnResponse(res)In前端登录界面,jwt应该存放在localStoragelocalStorage.setItem('jwt',result.data.jwt)
