jazzband / django-debug-toolbar

A configurable set of panels that display various debug information about the current request/response.
https://django-debug-toolbar.readthedocs.io/
BSD 3-Clause "New" or "Revised" License
7.99k stars 1.04k forks source link

v1.0.1 causes circular import with django-authority 0.8 #524

Closed egasimus closed 10 years ago

egasimus commented 10 years ago

Building a custom CMS with Django 1.6.1. After updating to django-debug-toolbar 1.0.1, I started getting a strange error when trying to run syncdb, migrate or schemamigration (probably some others as well); but not when importing stuff from shell.

Removing django-debug-toolbar from INSTALLED_APPS fixed the issue, and so did reverting to v0.11.0. Installing django-debug-toolbar 1.0.1 from scratch (i.e. re-initializing my development VM from scratch) didn't help; in fact, that was when I found out there's something wrong.

Judging from the import trace (python -v), the culprit is the redirects panel; I have a reference to a custom AdminSite in my urls.py, and that AdminSite uses custom django-authority permissions extensively. However, something that the redirects panel is doing seems to cause a circular import.

Stack trace:

Traceback (most recent call last):
  File "/vagrant/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 272, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 75, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 40, in import_module
    __import__(name)
  File "/usr/local/lib/python2.7/dist-packages/south/management/commands/__init__.py", line 10, in <module>
    import django.template.loaders.app_directories
  File "/usr/local/lib/python2.7/dist-packages/django/template/loaders/app_directories.py", line 28, in <module>
    raise ImproperlyConfigured('ImportError %s: %s' % (app, e.args[0]))
django.core.exceptions.ImproperlyConfigured: ImportError authority: cannot import name BasePermission

_List of installed apps:_

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'devserver',
    'south',
    'authority',
    'reversion',
    'taggit',
    'mptt',
    'media_tree',
    'media_tree.contrib.views',
    'debug_toolbar',

    'cms')

Import trail (output of python -v, extra comments removed for clarity)

import authority.models # /usr/local/lib/python2.7/dist-packages/authority/models.pyc
import authority.managers # /usr/local/lib/python2.7/dist-packages/authority/managers.pyc
import authority.utils # /usr/local/lib/python2.7/dist-packages/authority/utils.pyc
import django.contrib.admin.models # /usr/local/lib/python2.7/dist-packages/django/contrib/admin/models.pyc
import django.contrib.sessions.models # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/models.pyc
import django.contrib.sessions.backends # directory /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends
import django.contrib.sessions.backends # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/__init__.pyc
import django.contrib.sessions.backends.db # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/db.pyc
import django.contrib.sessions.backends.base # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/backends/base.pyc
import django.contrib.sessions.exceptions # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/exceptions.pyc
import django.contrib.messages.models # /usr/local/lib/python2.7/dist-packages/django/contrib/messages/models.pyc
import django.contrib.staticfiles.models # /usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/models.pyc
import devserver.models # /usr/local/lib/python2.7/dist-packages/devserver/models.pyc
import devserver.logger # /usr/local/lib/python2.7/dist-packages/devserver/logger.pyc
import devserver.settings # /usr/local/lib/python2.7/dist-packages/devserver/settings.pyc
import devserver.modules # directory /usr/local/lib/python2.7/dist-packages/devserver/modules
import devserver.modules # /usr/local/lib/python2.7/dist-packages/devserver/modules/__init__.pyc
import devserver.modules.sql # /usr/local/lib/python2.7/dist-packages/devserver/modules/sql.pyc
import devserver.utils # directory /usr/local/lib/python2.7/dist-packages/devserver/utils
import devserver.utils # /usr/local/lib/python2.7/dist-packages/devserver/utils/__init__.pyc
import devserver.utils.time # /usr/local/lib/python2.7/dist-packages/devserver/utils/time.pyc
import sqlparse # directory /usr/local/lib/python2.7/dist-packages/sqlparse
import sqlparse # /usr/local/lib/python2.7/dist-packages/sqlparse/__init__.pyc
import sqlparse.engine # directory /usr/local/lib/python2.7/dist-packages/sqlparse/engine
import sqlparse.engine # /usr/local/lib/python2.7/dist-packages/sqlparse/engine/__init__.pyc
import sqlparse.lexer # /usr/local/lib/python2.7/dist-packages/sqlparse/lexer.pyc
import sqlparse.tokens # /usr/local/lib/python2.7/dist-packages/sqlparse/tokens.pyc
import sqlparse.keywords # /usr/local/lib/python2.7/dist-packages/sqlparse/keywords.pyc
import sqlparse.engine.grouping # /usr/local/lib/python2.7/dist-packages/sqlparse/engine/grouping.pyc
import sqlparse.sql # /usr/local/lib/python2.7/dist-packages/sqlparse/sql.pyc
import sqlparse.engine.filter # /usr/local/lib/python2.7/dist-packages/sqlparse/engine/filter.pyc
import sqlparse.filters # /usr/local/lib/python2.7/dist-packages/sqlparse/filters.pyc
import sqlparse.pipeline # /usr/local/lib/python2.7/dist-packages/sqlparse/pipeline.pyc
import sqlparse.utils # /usr/local/lib/python2.7/dist-packages/sqlparse/utils.pyc
import sqlparse.formatter # /usr/local/lib/python2.7/dist-packages/sqlparse/formatter.pyc
import sqlparse.exceptions # /usr/local/lib/python2.7/dist-packages/sqlparse/exceptions.pyc
import debug_toolbar.panels # directory /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels
import debug_toolbar.panels # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/__init__.pyc
import debug_toolbar.panels.sql # directory /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql
import debug_toolbar.panels.sql # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/__init__.pyc
import debug_toolbar.panels.sql.panel # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/panel.pyc
import uuid # /usr/lib/python2.7/uuid.pyc
import ctypes # directory /usr/lib/python2.7/ctypes
import ctypes # /usr/lib/python2.7/ctypes/__init__.pyc
dlopen("/usr/lib/python2.7/lib-dynload/_ctypes.so", 2);
import _ctypes # dynamically loaded from /usr/lib/python2.7/lib-dynload/_ctypes.so
import ctypes._endian # /usr/lib/python2.7/ctypes/_endian.pyc
import ctypes.util # /usr/lib/python2.7/ctypes/util.pyc
import debug_toolbar.panels.sql.forms # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/forms.pyc
import debug_toolbar.panels.sql.utils # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/utils.pyc
import debug_toolbar.utils # /usr/local/lib/python2.7/dist-packages/debug_toolbar/utils.pyc
import debug_toolbar.settings # /usr/local/lib/python2.7/dist-packages/debug_toolbar/settings.pyc
import debug_toolbar.panels.sql.tracking # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/tracking.pyc
import devserver.modules.profile # /usr/local/lib/python2.7/dist-packages/devserver/modules/profile.pyc
import devserver.modules.ajax # /usr/local/lib/python2.7/dist-packages/devserver/modules/ajax.pyc
import devserver.modules.cache # /usr/local/lib/python2.7/dist-packages/devserver/modules/cache.pyc
import south.models # /usr/local/lib/python2.7/dist-packages/south/models.pyc
import south.db # directory /usr/local/lib/python2.7/dist-packages/south/db
import south.db # /usr/local/lib/python2.7/dist-packages/south/db/__init__.pyc
import south.db.postgresql_psycopg2 # /usr/local/lib/python2.7/dist-packages/south/db/postgresql_psycopg2.pyc
import south.db.generic # /usr/local/lib/python2.7/dist-packages/south/db/generic.pyc
import south.logger # /usr/local/lib/python2.7/dist-packages/south/logger.pyc
import south.utils # directory /usr/local/lib/python2.7/dist-packages/south/utils
import south.utils # /usr/local/lib/python2.7/dist-packages/south/utils/__init__.pyc
import south.utils.py3 # /usr/local/lib/python2.7/dist-packages/south/utils/py3.pyc
import debug_toolbar.models # /usr/local/lib/python2.7/dist-packages/debug_toolbar/models.pyc
import debug_toolbar.middleware # /usr/local/lib/python2.7/dist-packages/debug_toolbar/middleware.pyc
import debug_toolbar.toolbar # /usr/local/lib/python2.7/dist-packages/debug_toolbar/toolbar.pyc
import debug_toolbar.panels.versions # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/versions.pyc
import debug_toolbar.panels.timer # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/timer.pyc
dlopen("/usr/lib/python2.7/lib-dynload/resource.so", 2);
import resource # dynamically loaded from /usr/lib/python2.7/lib-dynload/resource.so
import debug_toolbar.panels.settings # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/settings.pyc
import debug_toolbar.panels.headers # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/headers.pyc
import debug_toolbar.panels.request # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/request.pyc
import debug_toolbar.panels.staticfiles # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/staticfiles.pyc
import debug_toolbar.panels.templates # directory /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/templates
import debug_toolbar.panels.templates # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/templates/__init__.pyc
import debug_toolbar.panels.templates.panel # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/templates/panel.pyc
import debug_toolbar.panels.cache # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/cache.pyc
import debug_toolbar.panels.signals # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/signals.pyc
import debug_toolbar.panels.logging # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/logging.pyc
import debug_toolbar.panels.redirects # /usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/redirects.pyc
import django.middleware.common # /usr/local/lib/python2.7/dist-packages/django/middleware/common.pyc
import django.contrib.sessions.middleware # /usr/local/lib/python2.7/dist-packages/django/contrib/sessions/middleware.pyc
import django.contrib.auth.middleware # /usr/local/lib/python2.7/dist-packages/django/contrib/auth/middleware.pyc
import django.contrib.auth.backends # /usr/local/lib/python2.7/dist-packages/django/contrib/auth/backends.pyc
import django.contrib.messages.middleware # /usr/local/lib/python2.7/dist-packages/django/contrib/messages/middleware.pyc
import django.middleware.clickjacking # /usr/local/lib/python2.7/dist-packages/django/middleware/clickjacking.pyc
import myproject.urls # /vagrant/myproject/urls.pyc
import django.conf.urls.static # /usr/local/lib/python2.7/dist-packages/django/conf/urls/static.pyc
import django.contrib.auth.views # /usr/local/lib/python2.7/dist-packages/django/contrib/auth/views.pyc
import django.views.decorators.debug # /usr/local/lib/python2.7/dist-packages/django/views/decorators/debug.pyc
import django.contrib.auth.decorators # /usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.pyc
import django.views.generic # directory /usr/local/lib/python2.7/dist-packages/django/views/generic
import django.views.generic # /usr/local/lib/python2.7/dist-packages/django/views/generic/__init__.pyc
import django.views.generic.base # /usr/local/lib/python2.7/dist-packages/django/views/generic/base.pyc
import django.views.generic.dates # /usr/local/lib/python2.7/dist-packages/django/views/generic/dates.pyc
import django.views.generic.detail # /usr/local/lib/python2.7/dist-packages/django/views/generic/detail.pyc
import django.views.generic.list # /usr/local/lib/python2.7/dist-packages/django/views/generic/list.pyc
import django.views.generic.edit # /usr/local/lib/python2.7/dist-packages/django/views/generic/edit.pyc
import cms # directory /vagrant/myproject/apps/cms
import cms # /vagrant/myproject/apps/cms/__init__.pyc
import cms.admin # directory /vagrant/myproject/apps/cms/admin
import cms.admin # /vagrant/myproject/apps/cms/admin/__init__.pyc
import cms.admin.site # /vagrant/myproject/apps/cms/admin/site.pyc
import cms.permissions # /vagrant/myproject/apps/cms/permissions.pyc
import taggit.models # /usr/local/lib/python2.7/dist-packages/taggit/models.pyc
import mptt.models # /usr/local/lib/python2.7/dist-packages/mptt/models.pyc
import mptt.fields # /usr/local/lib/python2.7/dist-packages/mptt/fields.pyc
import mptt.forms # /usr/local/lib/python2.7/dist-packages/mptt/forms.pyc
import mptt.exceptions # /usr/local/lib/python2.7/dist-packages/mptt/exceptions.pyc
import south.modelsinspector # /usr/local/lib/python2.7/dist-packages/south/modelsinspector.pyc
import south.introspection_plugins # directory /usr/local/lib/python2.7/dist-packages/south/introspection_plugins
import south.introspection_plugins # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/__init__.pyc
import south.introspection_plugins.geodjango # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/geodjango.pyc
import south.introspection_plugins.django_audit_log # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/django_audit_log.pyc
import south.introspection_plugins.django_tagging # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/django_tagging.pyc
import south.introspection_plugins.django_taggit # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/django_taggit.pyc
import taggit.managers # /usr/local/lib/python2.7/dist-packages/taggit/managers.pyc
import taggit.forms # /usr/local/lib/python2.7/dist-packages/taggit/forms.pyc
import taggit.utils # /usr/local/lib/python2.7/dist-packages/taggit/utils.pyc
import south.introspection_plugins.django_objectpermissions # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/django_objectpermissions.pyc
import south.introspection_plugins.annoying_autoonetoone # /usr/local/lib/python2.7/dist-packages/south/introspection_plugins/annoying_autoonetoone.pyc
import mptt.managers # /usr/local/lib/python2.7/dist-packages/mptt/managers.pyc
import media_tree.models # /usr/local/lib/python2.7/dist-packages/media_tree/models.pyc
import media_tree.settings # /usr/local/lib/python2.7/dist-packages/media_tree/settings.pyc
import media_tree.media_types # /usr/local/lib/python2.7/dist-packages/media_tree/media_types.pyc
import media_tree.utils # directory /usr/local/lib/python2.7/dist-packages/media_tree/utils
import media_tree.utils # /usr/local/lib/python2.7/dist-packages/media_tree/utils/__init__.pyc
import media_tree.utils.staticfiles # /usr/local/lib/python2.7/dist-packages/media_tree/utils/staticfiles.pyc
import PIL # directory /usr/local/lib/python2.7/dist-packages/PIL
import PIL # /usr/local/lib/python2.7/dist-packages/PIL/__init__.pyc
import PIL.Image # /usr/local/lib/python2.7/dist-packages/PIL/Image.pyc
import FixTk # /usr/lib/python2.7/lib-tk/FixTk.pyc
dlopen("/usr/local/lib/python2.7/dist-packages/PIL/_imaging.so", 2);
import PIL._imaging # dynamically loaded from /usr/local/lib/python2.7/dist-packages/PIL/_imaging.so
import PIL.ImageMode # /usr/local/lib/python2.7/dist-packages/PIL/ImageMode.pyc
import PIL._binary # /usr/local/lib/python2.7/dist-packages/PIL/_binary.pyc
import PIL._util # /usr/local/lib/python2.7/dist-packages/PIL/_util.pyc
import media_tree.utils.filenode # /usr/local/lib/python2.7/dist-packages/media_tree/utils/filenode.pyc
import cms.models # /vagrant/myproject/apps/cms/models.pyc
import media_tree.fields # /usr/local/lib/python2.7/dist-packages/media_tree/fields.pyc
import media_tree.widgets # /usr/local/lib/python2.7/dist-packages/media_tree/widgets.pyc
import media_tree.media_backends # directory /usr/local/lib/python2.7/dist-packages/media_tree/media_backends
import media_tree.media_backends # /usr/local/lib/python2.7/dist-packages/media_tree/media_backends/__init__.pyc
import model_utils # directory /usr/local/lib/python2.7/dist-packages/model_utils
import model_utils # /usr/local/lib/python2.7/dist-packages/model_utils/__init__.pyc
import model_utils.choices # /usr/local/lib/python2.7/dist-packages/model_utils/choices.pyc
import model_utils.tracker # /usr/local/lib/python2.7/dist-packages/model_utils/tracker.pyc
import model_utils.managers # /usr/local/lib/python2.7/dist-packages/model_utils/managers.pyc
import cms.querysets # /vagrant/myproject/apps/cms/querysets.pyc
import debug_toolbar.models # /usr/local/lib/python2.7/dist-packages/debug_toolbar/models.pyc
import myproject.urls # /vagrant/myproject/urls.pyc
import cms.admin # directory /vagrant/myproject/apps/cms/admin
import cms.admin # /vagrant/myproject/apps/cms/admin/__init__.pyc
import cms.admin.site # /vagrant/myproject/apps/cms/admin/site.pyc
import cms.permissions # /vagrant/myproject/apps/cms/permissions.pyc
ImportError: ImportEr...ission
egasimus commented 10 years ago

Actually, setting DEBUG_TOOLBAR_PATCH_SETTINGS = False in my settings file ostensibly fixed things. I already had debug_toolbar.middleware.DebugToolbarMiddleware in my MIDDLEWARE_CLASSES when patching was set to True, however removing it didn't help. So this apparently has to do with the patcher itself.

aaugustin commented 10 years ago

Yes, the automatic patcher doesn't work well in projects that have some form of autodiscovery. You have to use the explicit setup, as explained in the documentation.