0

私の Django プロジェクトには 2 つのアプリケーションがあります。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'),                         
)  

プロジェクトに両方のアプリケーションをインストールし、それらが持つモデルのインスタンスをいくつか作成しようとしました。次のエラーが発生したアクセス許可の割り当て手順まで、すべて正常に動作します (オブジェクトが作成され、DB に保存されます)。

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 internal にあります。ガベージ コレクターがローカル コンテキストを消去し、すべてのインポートを 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 などのアプリケーションの 1 つを削除すると、他のアプリケーションは正常に動作します。つまり、すべての権限が設定されます。

この問題の原因が自分のアプリにあるのか、ガーディアンにあるのか、それとも完全に他のアプリケーションにあるのか、私にはわかりません。

4

1 に答える 1

0

この問題に数日間苦労した後、私は最終的に解決策を見つけ、この問題の本当の原因を見つけました. まず、Django 1.6.10 を使用しています。両方のアプリケーションで、user_logged_in シグナルのハンドラーを登録しました。適切な関数とバインディング (user_logged_in.connect(handler)) を両方のアプリの signal.py というファイルに入れました。次に、シグナル接続を機能させるために、signals.py が __init__.py にインポートされました。また、ファイルの 1 つで models.py に別の依存関係があり、これも signal.py にインポートされました。これはアプリの 1 つで行われました。要するに、問題はアプリの 1 つでの循環インポートでした。私が見つけた解決策は、signals.py の内容を models.py に移動し、__init__.py からシグナルのインポートを削除することでした。

于 2015-07-31T13:37:52.520 に答える