使用监护人的快捷方式分配权限 assign_perm 导致 'NoneType' 对象没有属性 'objects'
Assiging permissions with guardian's shortcut assign_perm results in 'NoneType' object has no attribute 'objects'
我的 Django 项目中有两个应用程序,假设它们是 appA 和 appB。这些应用程序是通过 pip install
从外部包安装的。他们都在他们的模型中有额外的权限:
appA 有:
class Meta:
permissions = (
('clone_poll', 'Can clone poll'),
('close_poll', 'Can close poll'),
('viewresults_poll', 'Can view poll results'),
)
appB 已获得:
class Meta:
permissions = (
('viewresults_meeting', 'Can view meeting results'),
)
我在我的项目中安装了这两个应用程序,并尝试创建它们拥有的模型的一些实例。一切正常(创建对象并保存到数据库),直到权限分配步骤发生以下错误:
Traceback (most recent call last):
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/polls/views.py", line 529, in clone_poll
initial_dict=initial)(request, kwargs=kwa)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 236, in dispatch
response = super(WizardView, self).dispatch(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
return handler(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 297, in post
return self.render_done(form, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 350, in render_done
done_response = self.done(final_form_list, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/polls/views.py", line 203, in done
assign_perm('polls.change_poll', self.request.user, poll_obj)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/shortcuts.py", line 91, in assign_perm
return model.objects.assign_perm(perm, user, obj)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/managers.py", line 41, in assign_perm
obj_perm, created = self.get_or_create(**kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/db/models/manager.py", line 154, in get_or_create
return self.get_queryset().get_or_create(**kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/db/models/query.py", line 380, in get_or_create
obj.save(force_insert=True, using=self.db)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/models.py", line 44, in save
content_type = ContentType.objects.get_for_model(self.content_object)
AttributeError: 'NoneType' object has no attribute 'objects'
我查看了具体错误发生的地方,是在django-guardian内部。垃圾收集器似乎清理了本地上下文,将所有导入设置为 None:
'UserObjectPermissionManager': None,
'__file__': None,
'user_model_label': None,
'__name__': None,
'GroupObjectPermissionManager': None,
'ContentType': None,
'settings': None,
'Permission': None,
'GroupObjectPermissionBase': None,
'BaseObjectPermission': None,
'UserObjectPermissionBase': None
此外,当我删除其中一个应用程序时,例如来自 INSTALLED_APPS 的 appA,另一个工作正常,即设置了所有权限。
我不知道这个问题的根源是什么,是在我的应用程序中,在监护人中还是在其他应用程序中?
经过几天与这个问题的斗争,我终于找到了解决方案,以及这个问题的真正根源。
首先,我一直在使用 Django 1.6.10。在这两个应用程序中,我都为 user_logged_in 信号注册了处理程序。我将适当的函数和绑定(user_logged_in.connect(处理程序))放入两个应用程序中名为 signals.py 的文件中。然后在 __init__.py 中导入 signals.py,使信号连接正常。在其中一个文件中还有另一个对 models.py 的依赖,它也被导入到 signals.py - 这是在其中一个应用程序中完成的。说到重点,问题是其中一个应用程序中的循环导入。我发现可行的解决方案是将 signals.py 内容移动到 models.py,从 __init__.py.
中删除信号导入
我的 Django 项目中有两个应用程序,假设它们是 appA 和 appB。这些应用程序是通过 pip install
从外部包安装的。他们都在他们的模型中有额外的权限:
appA 有:
class Meta:
permissions = (
('clone_poll', 'Can clone poll'),
('close_poll', 'Can close poll'),
('viewresults_poll', 'Can view poll results'),
)
appB 已获得:
class Meta:
permissions = (
('viewresults_meeting', 'Can view meeting results'),
)
我在我的项目中安装了这两个应用程序,并尝试创建它们拥有的模型的一些实例。一切正常(创建对象并保存到数据库),直到权限分配步骤发生以下错误:
Traceback (most recent call last):
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/polls/views.py", line 529, in clone_poll
initial_dict=initial)(request, kwargs=kwa)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 236, in dispatch
response = super(WizardView, self).dispatch(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
return handler(request, *args, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 297, in post
return self.render_done(form, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/contrib/formtools/wizard/views.py", line 350, in render_done
done_response = self.done(final_form_list, **kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/polls/views.py", line 203, in done
assign_perm('polls.change_poll', self.request.user, poll_obj)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/shortcuts.py", line 91, in assign_perm
return model.objects.assign_perm(perm, user, obj)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/managers.py", line 41, in assign_perm
obj_perm, created = self.get_or_create(**kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/db/models/manager.py", line 154, in get_or_create
return self.get_queryset().get_or_create(**kwargs)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/django/db/models/query.py", line 380, in get_or_create
obj.save(force_insert=True, using=self.db)
File "/home/polls/pythonPolls/lib/python2.7/site-packages/guardian/models.py", line 44, in save
content_type = ContentType.objects.get_for_model(self.content_object)
AttributeError: 'NoneType' object has no attribute 'objects'
我查看了具体错误发生的地方,是在django-guardian内部。垃圾收集器似乎清理了本地上下文,将所有导入设置为 None:
'UserObjectPermissionManager': None,
'__file__': None,
'user_model_label': None,
'__name__': None,
'GroupObjectPermissionManager': None,
'ContentType': None,
'settings': None,
'Permission': None,
'GroupObjectPermissionBase': None,
'BaseObjectPermission': None,
'UserObjectPermissionBase': None
此外,当我删除其中一个应用程序时,例如来自 INSTALLED_APPS 的 appA,另一个工作正常,即设置了所有权限。
我不知道这个问题的根源是什么,是在我的应用程序中,在监护人中还是在其他应用程序中?
经过几天与这个问题的斗争,我终于找到了解决方案,以及这个问题的真正根源。 首先,我一直在使用 Django 1.6.10。在这两个应用程序中,我都为 user_logged_in 信号注册了处理程序。我将适当的函数和绑定(user_logged_in.connect(处理程序))放入两个应用程序中名为 signals.py 的文件中。然后在 __init__.py 中导入 signals.py,使信号连接正常。在其中一个文件中还有另一个对 models.py 的依赖,它也被导入到 signals.py - 这是在其中一个应用程序中完成的。说到重点,问题是其中一个应用程序中的循环导入。我发现可行的解决方案是将 signals.py 内容移动到 models.py,从 __init__.py.
中删除信号导入