Django中带有自定义权限的Python用户组

Django中带有自定义权限的Python用户组

让我们考虑一下旅行预订服务,他们是如何通过不同的计划和套餐工作的。有一个产品清单,用户在订购不同的套餐时可以得到该公司提供的产品。一般来说,他们遵循的理念是按级别分配不同的产品。

让我们看看旅游预订服务中的不同套餐。

1.初始计划:在这个套餐中,用户将获得非空调巴士旅行和在非空调房间住宿1天的便利。比方说,旅行是从德里到哈里德瓦(北阿坎德邦的一个宗教场所)。
2.黄金计划:该计划的费用将比起步计划高一些。在这个计划中,用户将被安排在非空调房中停留2天,乘坐空调巴士,行程将从德里到哈里瓦、瑞诗凯诗和穆索里。
3.钻石计划 :这是最昂贵的计划,用户将获得3天的计划,包括AC巴士和AC房间住宿,以及哈里瓦、瑞诗凯诗和穆索里的旅行,还有水上公园的旅行。

我们的主要目标是以一种非常有效的方式设计和编写后端代码(遵循DRY原则)。
在Django中,有多种方法可以实现这一点,但最合适和有效的方法是将用户分组,并定义这些组的权限。该组的用户将自动继承该组的权限。让我们先定义一下用户模型。

创建一个Django应用程序users。在models.py文件中,在’users’应用目录下,写下这段代码。

# importing necessary django classes
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.db import models
 
# User class
class User(AbstractUser):
 
    # Define the extra fields
    # related to User here
    first_name = models.CharField(_('First Name of User'),
                            blank = True, max_length = 20)
                             
    last_name = models.CharField(_('Last Name of User'),
                            blank = True, max_length = 20)
                             
# More User fields according to need
 
    # define the custom permissions
    # related to User.
    class Meta:
         
        permissions = (
            ("can_go_in_non_ac_bus", "To provide non-AC Bus facility"),
            ("can_go_in_ac_bus", "To provide AC-Bus facility"),
            ("can_stay_ac-room", "To provide staying at AC room"),
            ("can_stay_ac-room", "To provide staying at Non-AC room"),
            ("can_go_dehradoon", "Trip to Dehradoon"),
            ("can_go_mussoorie", "Trip to Mussoorie"),
            ("can_go_haridwaar", "Trip to Haridwaar"),
            ("can_go_rishikesh", "Trip to Rishikesh"),
 
# Add other custom permissions according to need.

迁移了上面写的模型后,我们有两个选择来制作组。

1.Django管理小组:在管理小组中,你会看到黑体字的组,点击该组并建立3个不同的组,分别命名为level0, level1, level3。同时,根据需要定义自定义权限。
2.通过程序化地创建一个具有权限的组。使用python manage.py shell打开python shell。

# importing group class from django
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
 
# import User model
from users.models import User
 
new_group, created = Group.objects.get_or_create(name ='new_group')
 
# Code to add permission to group
ct = ContentType.objects.get_for_model(User)
 
# If I want to add 'Can go Haridwar' permission to level0 ?
permission = Permission.objects.create(codename ='can_go_haridwar',
                                        name ='Can go to Haridwar',
                                                content_type = ct)
new_group.permissions.add(permission)

我们将以同样的方式为所有三个组设置不同的权限。在那之前,我们已经建立了组,并将其与自定义权限联系起来。

现在,检查一个特定的用户是否访问了适当的功能,比如,设置一个限制,level0不能访问level1用户level2用户的功能,等等。为了做到这一点,检查每个视图功能的权限。
这里要非常小心,对于基于函数的视图,我们将简单地使用自定义装饰器。

例如:

@group_required('level0')
def my_view(request):
    ...

更多细节,请参考本网站。
当我们谈论基于类的视图时,事情变得有点复杂,我们不能简单地只添加一个装饰函数,而是要做一个权限混合类。

例如:

class GroupRequiredMixin(object):
    ...............
    ....Class Definition.....
 
 
class DemoView(GroupRequiredMixin, View):
  group_required = [u'admin', u'manager']
   
  # View code...

更多细节,请参考。

1. https://docs.djangoproject.com/en/1.11/topics/class-based-views/mixins/
2. http://bradmontgomery.blogspot.in/2009/04/restricting-access-by-group-in-django.html
3. https://simpleisbetterthancomplex.com/2015/12/07/working-with-django-view-decorators.html
4. https://micropyramid.com/blog/custom-decorators-to-check-user-roles-and-permissions-in-django/

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Django 教程