assign什么意思,assistant怎么读

  

  用django框架做一些后台管理的网页简直太方便了。django自带模块级权限系统,非常适合做一些内部系统,可以大大减少开发量。但是django自己的权限系统还不支持行级权限控制。如果要实现行级权限控制,需要依靠第三方app开发,或者自己重新写一个。   

  

  需求描述   

  

  我们项目组开发的一些系统,通常使用mysql数据库来存储一些配置,但是每次有配置修改的时候手动修改mysql数据会很麻烦,容易出错。Django-admin可以根据定义的模型自动生成相应的页面,同时可以提供权限管理,所以我们把一些系统特有的配置放到Django中。但是到现在,随着对系统的需求越来越大,系统不仅被我们自己项目组的人员使用,其他项目组的同事也在使用,所以出现了一些更细粒度的权限需求。因此,我们应该在现有系统上支持行级权限控制。   

  

  解决办法   

  

  当然可以自己写权限系统,但是自己写成本比较高,自己写不一定更好。所以我先在网上找了一些现成的解决方案,https://djangopackages.org/grids/g/perms/的这个链接列出了一些现有的第三方维权系统解决方案。从这个页面来看,django-guardian是最流行的第三方权限系统,它支持行级权限系统。同时可以集成到django-admin中,所以我选择了django-guardian。   

  

  关键步骤   

  

  私信小编007即可获取数十套PDF的获取方式哦!   

  

  配置django-guardian   

  

  安装django-guardian相对简单。按照她项目提供的文档安装就行了。安装完成后,将在数据库中创建两个与权限相关的表。   

  

  将django-guardian整合到django-admin中   

  

  首先,将admin.py文件中需要行级权限的类从继承admin更改为。ModelAdmin来继承GuardedModelAdmin此时,当一个数据行的页面打开时,编辑对象权限的按钮会显示在页面右上角的历史旁边。点击此按钮进入相应页面编辑该行数据的具体权限。   

  

  完成权限配置后,如果用新用户进行测试,会发现该用户没有访问任何数据的权限。这是因为GuardedModelAdmin还有很多事情要我们做,我们需要重写一些函数来显示管理后台页面。有关具体信息,请参见下面的代码注释。   

  

  从监护人.管理员导入GuardedModelAdminfrom从监护人.快捷方式导入get_objects_for_user,assign_perm,remove_perm,get_users_with_perms,\ get_groups_with_perms #需改前@ admin。注册(数据助理作业)类DataAssistantJobAdmin(admin .模型管理员):通行证#修改后@ admin。注册(数据助理作业)类DataAssistantJobAdmin(GuardedModelAdmin): #应用程序是否在主页面中显示的话由该函数决定def has_module_permission(self,request): if super().has _ module _ permission(请求):返回真实的返回self.get_model_objs(request).存在()#在显示数据列表额时候,哪些数据显示,哪些不显示,由该函数控制def get_queryset(self,request): if请求。用户。is _ super用户:返回super().get _ query set(request)data=self。get _ model _ objs(请求)返回数据#内部用来获取某个用户有权限访问的数据行def get_model_objs(self,request,action=None,klass=None): opts=self。opts actions=if action else ' view ',' change ',' delete ' klass=klass if klass else opts。型号model _ name=klass ._ meta。model _ name返回get _ objects _ for _ user(user=request。user,perms=,klass=klass,any_perm=True) #用来判断某个用户是否有某个数据行的权限def has_perm(self,request,obj,action): opts=self。opts codename=f"{ action } _ { opts。model _ name } "如果obj :返回请求。用户。has _ perm(f"{ opts。app _ label } .{codename} ',obj)else :返回self。get _ model _ objs(请求,动作).存在()#是否有查看某个数据行的权限def has_view_permission(self,request,obj=None):返回self。has _ perm(request,obj,' view') #是否有修改某个数据行的权限def has_change_permission(self,request,obj=None):返回self。has _ perm(request,obj,' change') #是否有删除某个数据行的权限def has_delete_permission(self,request,obj=None):返回self。has _ perm(request,obj,' delete') #用户应该拥有他新增的数据行的所有权限def save_model(self,request,obj,form,change): result=super().如果不是请求,则保存模型。用户。is _超级用户而不改: opts=self。opts actions='查看','添加','更改','删除'返回结果通过上面的修改姜戈-管理中的模块就能够支持行级的权限,并能够正确的在后台页面中显示出来,当然如果有很多的模块需要支持行级的权限控制,则可以把上面的这些修改写到一个新的类中,然后其他想支持行级权限的模块再从该模块继承就可以了。   

  

  总结   

  

     

  

  感觉姜戈卫报和姜戈-管理整合,实现的不是很好。如果开发者对框架内部的代码不怎么了解,那么用姜戈卫报来实现行级权限控制的话会挺麻烦的,个人认为姜戈卫报完全可以把和姜戈-管理的整合做到开箱即用的效果,就像框架自带的权限系统一样。   

相关文章