2012-01-04 67 views
2

如何在django中调试权限问题?调试Django权限错字

我用这样的代码:

if request.user.has_perm('foo.bar'): 

我怎么能知道是否有在“foo.bar”一个错字?

回答

2

我找到了答案。只需修改(临时)backends.py的代码:

--- django/contrib/auth/backends.py (Revision 17045) 
+++ django/contrib/auth/backends.py (Arbeitskopie) 
@@ -43,6 +43,9 @@ 
     return user_obj._perm_cache 

    def has_perm(self, user_obj, perm): 
+  all_perms=[u'%s.%s' % (ct, name) for ct, name in Permission.objects.values_list('content_type__app_label', 'codename')] 
+  if not perm in all_perms: 
+   raise Exception('Permission %s does not exist. foo permissions: %s' % (perm, [p for p in all_perms if 'foo' in p])) 
     if not user_obj.is_active: 
      return False 
     return perm in self.get_all_permissions(user_obj) 
+0

你可以写你自己的后端做到这一点,而不是修改的Django源:https://docs.djangoproject.com/en/1.3/topics/auth/#handling-authorization-in-custom-backends – 2012-01-04 18:42:17

1

嗯,我想你可以看看所有定义的权限:

from django.contrib.auth.models import Permission 
perms = ['%s.%s' % (p.content_type.app_label, p.codename) 
    for p in Permission.objects.all()] 

>>> 'foo.bar' in perms 
False 
+0

另一种解决方案(暂时修改django的源)或定制的后端有一个优点:我可以运行我所有的单元测试,并查看是否有任何错字。 – guettli 2012-01-05 10:43:00

+1

你问过关于调试的问题,而不是单元测试。尽管如此,仍然有用。我绝对推荐在猴子补丁上定制后端。这样你也可以确保你只启用它进行测试,而不是生产 – second 2012-01-05 10:50:55