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/