由于不会使用Django中强大的admin管理功能(学习的时候跳着学的),所以自己自定义了一个简单的包含权限认证的用户管理模块。但是在使用过程中发现有很多视图可能使用到了特定的权限,而进行权限验证的代码具有明显的重复性。所以想抽取出来封装成一个独立的函数,传入所需要的权限,访问这个视图的用户就应该具有这个权限,否则禁止访问。Python中的装饰器恰好适用这个场景——在执行函数之前,先做点什么。
下面献上演示代码
def _auth(args):#args 是传入的,需要验证的权限 def __auth(func): def _login(request): if request.session.get('login_user', False): #判断是否登录 try: user = User.objects.get(username=request.session['login_user']) if not args:#如果args没定义的话,直接验证默认权限 if user.auth_group in auth(): return func(request) #权限验证通过,继续执行视图 else: return denied(request)#否则执行禁止视图 else: #如果定义了就将用户的权限跟预定义的进行匹配 if user.auth_group in args or user.auth_group == 'admin': return func(request)#权限验证通过,继续执行视图 else: #否则执行禁止视图 return denied(request) except User.DoesNotExist: return login(request) else:#如果没登录就跳转到登录界面 return login(request) return _login return __auth
这样定义好后,只需要在特定权限要求的视图函数定义上面用@调用就好了。比如,我现在有个后台管理的视图:
def manage(request): #do something return render_to_response(…)
这个视图需要管理员才可以访问,我们可以在头部添加上面提到的装饰器用于限定访问权限:
@_auth('admin') def manage(request): #do something return render_to_response(…)
这样就很方便的给每个有需要的视图增加权限验证功能,而不用每个视图都单独地写代码。
转载请注明:爱开源 » 通过装饰器快速给django视图添加权限验证