问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django 判断是否有某个权限跳转

发布网友 发布时间:2022-05-10 20:49

我来回答

2个回答

懂视网 时间:2022-05-11 01:10

Django的权限系统很简单,它可以赋予users或groups中的users以权限。

Django admin后台就使用了该权限系统,不过也可以用到你自己的代码中。

User对象具有两个ManyToManyField字段,groups和user_permissions

groups = models.ManyToManyField(Group, verbose_name=_('groups'),
blank=True, help_text=_('The groups this user belongs to. A user will '
'get all permissions granted to each of '
'their groups.'),
related_name="user_set", related_query_name="user")
user_permissions = models.ManyToManyField(Permission,
verbose_name=_('user permissions'), blank=True,
help_text=_('Specific permissions for this user.'),
related_name="user_set", related_query_name="user")

可以像其它的django Model一样来访问他们:

myuser.groups = [group_list]
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions = [permission_list]
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

权限Permissions

权限是作为一个Model存在的,建立一个权限就是创建一个Permission Model的实例。

@python_2_unicode_compatible
class Permission(models.Model):
"""
The permissions system PRovides a way to assign permissions to specific
users and groups of users.

The permission system is used by the Django admin site, but may also be
useful in your own code. The Django admin site uses permissions as follows:

- The "add" permission limits the user's ability to view the "add" form
and add an object.
- The "change" permission limits a user's ability to view the change
list, view the "change" form and change an object.
- The "delete" permission limits the ability to delete an object.

Permissions are set globally per type of object, not per specific object
instance. It is possible to say "Mary may change news stories," but it's
not currently possible to say "Mary may change news stories, but only the
ones she created herself" or "Mary may only change news stories that have a
certain status or publication date."

Three basic permissions -- add, change and delete -- are automatically
created for each Django model.
"""
name = models.CharField(_('name'), max_length=255)
content_type = models.ForeignKey(ContentType)
codename = models.CharField(_('codename'), max_length=100)
objects = PermissionManager()

class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
unique_together = (('content_type', 'codename'),)
ordering = ('content_type__app_label', 'content_type__model',
'codename')

def __str__(self):
return "%s | %s | %s" % (
six.text_type(self.content_type.app_label),
six.text_type(self.content_type),
six.text_type(self.name))

def natural_key(self):
return (self.codename,) + self.content_type.natural_key()
natural_key.dependencies = ['contenttypes.contenttype']

字段fields

name:必需。50个字符或更少,例如,’Can Vote‘

content_type:必需,一个对于django_content_type数据库table的引用,table中含有每个应用中的Model的记录。

codename:必需,100个字符或更少,例如,'can_vote'。

如果要为某个Model创建权限:

from django.db import models

class Vote(models.Model):
...

class Meta:
permissions = (("can_vote", "Can Vote"),)

如果这个Model在应用foo中,则权限表示为'foo.can_vote',检查某个用户是否具有权限myuser.has_perm('foo.can_vote')

默认权限default permissions

如果已经在 INSTALLED_APPS配置了django.contrib.auth,它会保证为installed applications中的每个Django Model创建3个缺省权限:add, change 和 delete。

这些权限会在你第一次运行 manage.py migrate(1.7之前为syncdb) 时创建。当时所有的models都会建立权限。在这之后创建的新models会在再次运行 manage.py migrate时创建这些默认权限。这些权限与admin管理界面中的创建,删除,修改行为是一一对应的。

假设你有一个应用 foo ,其中有一个模型 Bar, 你可以用下述方法来测试基本权限:

add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')
权限模型( Permission model)一般不直接使用。

组Groups

组也是作为Model存在的:

@python_2_unicode_compatible
class Group(models.Model):
"""
Groups are a generic way of categorizing users to apply permissions, or
some other label, to those users. A user can belong to any number of
groups.

A user in a group automatically has all the permissions granted to that
group. For example, if the group Site editors has the permission
can_edit_home_page, any user in that group will have that permission.

Beyond permissions, groups are a convenient way to categorize users to
apply some label, or extended functionality, to them. For example, you
could create a group 'Special users', and you could write code that would
do special things to those users -- such as giving them access to a
members-only portion of your site, or sending them members-only email
messages.
"""
name = models.CharField(_('name'), max_length=80, unique=True)
permissions = models.ManyToManyField(Permission,
verbose_name=_('permissions'), blank=True)

objects = GroupManager()

class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')

def __str__(self):
return self.name

def natural_key(self):
return (self.name,)

字段fields:

name:必需,80个字符或更少,例如, 'Awesome Users'。

permissions:ManyToManyField to Permission

group.permissions = [permission_list]
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()

Programmatically creating permissions

除了可以使用Model meta来创建权限,也可以直接用代码创建。

例如,为myapp应用中的BlogPost模型创建一个can_publish权限:

from myapp.models import BlogPost
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(codename='can_publish',
name='Can Publish Posts',
content_type=content_type)

权限可以被赋予一个User对象通过它的user_permissions属性或者赋予一个Group通过它的permissions属性。

权限缓存

User的权限检查时是可以被缓存的,如果一个新权限被赋予一个User,如果再立即检查是不会被检查出来的。最简单的方法是重新fetch User对象。

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id)
#权限检查会缓存现在的权限集
user.has_perm('myapp.change_bar')

permission = Permission.objects.get(codename='change_bar')
user.user_permissions.add(permission)

# 检查权限缓存集
user.has_perm('myapp.change_bar') # False

# 请求新实例
user = get_object_or_404(User, pk=user_id)

# Permission cache is repopulated from the database
user.has_perm('myapp.change_bar') # True

...

权限装饰器

permission_required(perm[, login_url=None, raise_exception=False])

检查用户是否具有某个权限,类似于@login_required()

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url='/loginpage/')
def my_view(request):
...

模板中的权限

user的的权限保存在模板变量 {{ perms }}中,是django.contrib.auth.context_processors.PermWrapper实例。

{{ perms.foo }}

上面的单属性是User.has_module_perms的代理。如果user拥有foo中的任一权限,则为True

{{ perms.foo.can_vote }}

上面的两级属性查询是User.has_perm的代理,如果用户拥有foo.can_vote权限则为True。

例如:

{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.can_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.can_drive %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}

或者:

{% if 'foo' in perms %}
{% if 'foo.can_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}

热心网友 时间:2022-05-10 22:18

django认证系统包含三个部分:用户、权限和分组如果不是使用django-admin.py创建项目的可以通过在django自带一个简单的权限系统
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
tplink无线扩展器怎样重置密码 扩展器原始的密码是什么 如何重新设置TPLink扩展器的密码简单步骤教你修改TPLink扩展器的... 为什么要加入tcpip协议 父母如何给孩子做一个好榜样 父母应该如何做孩子的榜样? 冬季草原防火安全知识 冬季景区该如何预防火灾 厨房暗管漏水 多少钱 手脚出汗,睡眠不好,早泄是阳虚还是阴虚 贵阳中天中学2021招生条件 北海德宝海上邱园怎么样?好不好?值不值得买? 哪个少年合唱团最好? 我们的户囗是贵州省的,但不是贵阳户口,孩子小学读的私立学校,升初中能不能被 高考加分问题 比较好的高中网校? 2014中国顶尖中学排行榜的榜单名录 贵阳市到百花湖镇做几路公交车能到达? - 信息提示 RAR密码破解工具_RAR Password Unlocker 3.2注册码是多少? 日企员工发“918勿忘国耻”被警告? 对于松下员工发“918勿忘国耻”被警告,官方作何回应? ff14 act 怎么看自己的死亡记录 关于918事变勿忘国耻的日记,四到五百字。 空客系列的飞机 引擎启动时候为什么有一种类似于狗叫的声音??注意 不是起飞 是滑行前启动引擎 ff14 act怎样全屏显示 B737比A320强在哪儿? EEC和ECU用电有什么区别 FSX模拟飞行,空客MCDU中的一些问题,请大侠指导 倪妮的五官比例挺标致的,但是她为什么不适合短发? 蒸汽机是干什么的 蒸汽机的作用原理是什么 《神秘老公,我还要》txt下载在线阅读全文,求百度网盘云资源 女生唱的 歌词有个老公老公我还要 这样的老公我还应该要吗? 鹅肝和猪肝 猪肝和鹅肝哪个更补铁 哪种动物肝脏营养价值高 动物肝脏是哪种动物最好,哪种动物的骨头汤 鹅肝猪肝哪个补血 我目前正在办卫生许可证,主要是做酒类配发 的 求 个《食品安全管理制度文本》 .请大侠赐教,不胜感激。 鸡肝和鸭肝哪个有营养 单纯的想要更健康一点,跑步应该慢跑还是应该快跑? 动物肝脏所富含的营养成分? 慢跑好还是快跑好?晨跑的时候需要注意什么? 猪肝和鹅肝哪种食物的胆固醇量高 跑步要慢跑还是快跑 请教一下,猪肝,牛肝,鹅肝,鸭肝,鸡肝那个更有营养啊? 酒类 管理制度 长时间慢跑和长时间快跑,哪个对身体更好?