博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django权限使用总结
阅读量:6761 次
发布时间:2019-06-26

本文共 1913 字,大约阅读时间需要 6 分钟。

概述

Django自带有用户验证系统,它可以处理User、Group、permission以及基于用户cookie的session。这个文档是基于Django官网文档的介绍,以及其他的资料整理而来。主要的内容介绍了Django的用户验证系统的基本工作原理,并且也会对于如何为你的项目定制用户验证做出简单介绍。

Permission在Django中的工作原理

首先,我们需要定义permission对象,而这个对象在定义的时候是需要与对应的model绑定的。

然后,定义好的permission就可以赋予给user或者group对象,实现permission与用户的绑定。
最后,在view以及template中可以通过API对于user或者group进行权限的校验了。

权限的定义

permission可以使用多种方式进行定义:

在model中定义

我们可以在model的Meta中对permission进行定义。

官网示例如下:

clipboard.png

单独定义

或者可以在独立于model之外的位置定义。

官网示例如下:

clipboard.png

不绑定特定的model定义

以上的两个例子都是需要我们已经具有model的情况下才能定义permission,如果我们还没有model的情况下,又想要定义permission的话,应该怎么处理呢?虽然这个需求有点奇怪

引用至GoogleGroup:

url_content_type = ContentType.objects.create(    name='url permission', app_label='crashstats', model='unused')can_view_url = Permission.objects.create(    name='can view url', content_type=url_content_type,    codename='can_view_url')user = User.objects.get(username='example_user', is_superuser=False)user.user_permissions.add(can_view_url)

这样通过绑定到一个不存在的model来实现也是支持的。实际使用中发现在定义ContentType的时候,给model赋值空字符串也是可行的,但是None则不行。

这样就会得到我们所定义的permission对象了。而且Django会为每个permission赋予一个全局唯一的code,规则:<app_label>.<permission_codename>。通过这个code就可以指定相应的permission

权限的授予

权限的授予可以通过user或者group来进行。

user通过user_permissions属性设置permission,group通过permissions属性设置permission。

官网示例如下:

clipboard.png

权限的校验

在view中校验权限

利用decorator校验

官网示例如下:

clipboard.png

注意:permissions除了用string指定单个权限之外,还支持list以及tuple用于多个权限。

利用Mixin校验

官网示例如下:

clipboard.png

在template中校验权限

如果在Django的settings里面设置了django.contrib.auth.context_processors.auth,以及启用了RequestContext的话,那Django就会默认在template中传递两个变量:

  • {

    { user }}

  • {

    { perms }}

其中的{

{ perms }}变量就可以实现在template使用permission,从而达到通过不同的permission提供不同的template的功能。

实际上Django在template当中对于permission的使用提供了两个API的功能,一个是User.has_module_perms;另一个是User.has_perm。

当你在template中使用{
{ perms.foo }}
的时候就会调用User.has_module_perms方法,如果用户具有foo这个permission的话,这个值就会为True。
当你在template中使用{
{ perms.foo.can_vote }}
的时候就会调用User.has_perm方法,如果用户具有foo.can_vote这个permission的话,这个值就会为True。

permission在template中的使用示例:

clipboard.png

clipboard.png

参考文档

转载地址:http://mebeo.baihongyu.com/

你可能感兴趣的文章
BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3) (转)
查看>>
Libgdx window add alpha action change the background actor alpha
查看>>
(转)过滤器原理
查看>>
JavaScript 触发click事件 兼容FireFox,IE 和 Chrome
查看>>
【英语称谓】软件行业外企称谓简称
查看>>
实现打印级别且带图片的Excel 方案
查看>>
使用 Java 程序写文件时,记得要 flush()
查看>>
OpenCV在矩阵上的卷积
查看>>
linux 编译java并打包
查看>>
What is Entity Framework?
查看>>
SQL Server 2008性能故障排查(一)——概论
查看>>
NGUI ScrollView动态加入和删除对象。
查看>>
****RESTful API 设计最佳实践(APP后端API设计参考典范)
查看>>
Linux内存管理-高端内存(二)
查看>>
[LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串
查看>>
FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法。。
查看>>
[LeetCode] 4Sum 四数之和
查看>>
Hello World 之 控制台版本(Console Application)
查看>>
IOS 播放动态Gif图片
查看>>
随笔1
查看>>