最新消息:

通过装饰器快速给django视图添加权限验证

Django admin 7865浏览 0评论

由于不会使用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视图添加权限验证

您必须 登录 才能发表评论!