lly creating permissions
除了可以使用Model meta来创建权限,也可以直接用代码创建。
例如,为myapp应用中的BlogPost模型创建一个can_publish权限:
1
2
3
4
5
6
7
8
|
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对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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'
)
user
=
get_object_or_404(User, pk
=
user_id)
user.has_perm(
'myapp.change_bar'
)
...
|
权限装饰器
permission_required(perm[, login_url=None, raise_exception=False])
检查用户是否具有某个权限,类似于@login_required()
1
2
3
4
5
|
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实例。
上面的单属性是User.has_module_perms的代理。如果user拥有foo中的任一权限,则为True
上面的两级属性查询是User.has_perm的代理,如果用户拥有foo.can_vote权限则为True。
例如: