jazzband / django-silk

Silky smooth profiling for Django
MIT License
4.42k stars 333 forks source link

Problem using `silk` and `debug-toolbar`. #287

Open SalahAdDin opened 6 years ago

SalahAdDin commented 6 years ago

I'm working a new project in i choosed this package for profiling; i want to use it in production while i use debug-toolbar in development.

My middleware in base.py:

MIDDLEWARE = [
    'django.middleware.gzip.GZipMiddleware',
    'django.middleware.http.ConditionalGetMiddleware',

    'silk.middleware.SilkyMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

My application in dev.py:

# Application definition
INSTALLED_APPS += [
    'wagtail.contrib.styleguide',
    'debug_toolbar',
    'naomi',
]

My application in production.py:

# Application definition
INSTALLED_APPS += [
    'silk',
    'storages',
]

So, i'm running migrations over the project and i'm gettings this problem:

./manage.py migrate                                                                                                                                                        ✔  2257  01:35:57 
/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)
Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 332, in execute
    self.check()
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 364, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 58, in _run_checks
    issues.extend(super()._run_checks(**kwargs))
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 351, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/debug_toolbar/apps.py", line 34, in check_middleware
    if is_middleware_class(GZipMiddleware, middleware):
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/debug_toolbar/apps.py", line 65, in is_middleware_class
    middleware_cls = import_string(middleware_path)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/utils/module_loading.py", line 17, in import_string
    module = import_module(module_path)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/middleware.py", line 10, in <module>
    from silk.collector import DataCollector
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/collector.py", line 9, in <module>
    from silk import models
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/models.py", line 55, in <module>
    class Request(models.Model):
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/db/models/base.py", line 108, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class silk.models.Request doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

Ok, i will try putting silk inside applications in dev.py:

./manage.py migrate                                                                                                                                                      1 ↵  2258  02:14:24 
/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)
Traceback (most recent call last):
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/urls/base.py", line 74, in reverse
    extra, resolver = resolver.namespace_dict[ns]
KeyError: 'silk'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/middleware.py", line 23, in silky_reverse
    r = reverse('silk:%s' % name, *args, **kwargs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/urls/base.py", line 84, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'silk' is not a registered namespace

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 332, in execute
    self.check()
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 364, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 58, in _run_checks
    issues.extend(super()._run_checks(**kwargs))
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/management/base.py", line 351, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/debug_toolbar/apps.py", line 34, in check_middleware
    if is_middleware_class(GZipMiddleware, middleware):
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/debug_toolbar/apps.py", line 65, in is_middleware_class
    middleware_cls = import_string(middleware_path)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/utils/module_loading.py", line 17, in import_string
    module = import_module(module_path)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/middleware.py", line 32, in <module>
    fpath = silky_reverse('summary')
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/silk/middleware.py", line 28, in silky_reverse
    r = reverse(name, *args, **kwargs)
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/urls/base.py", line 88, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "/home/salahaddin/Proyectos/Works/recipes/cms/lib/python3.6/site-packages/django/urls/resolvers.py", line 632, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'summary' not found. 'summary' is not a valid view function or pattern name.

It does not matter if i put silk before or after to debug-toolbar.

If i remove debug-toolbar from applications i haven't problems.

Why?

Ì'm using django==2.0.5.

Atorich commented 6 years ago

+1

lilfolr commented 6 years ago

did you add silk to your urls.py? urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]

SalahAdDin commented 6 years ago

@lilfolr yes, of course:

if settings.DEBUG:
    from django.conf.urls.static import static
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    import debug_toolbar

    urlpatterns = [
                      url(r'^__debug__/', include(debug_toolbar.urls)),
                  ] + urlpatterns
    urlpatterns += [
        url(r'^favicon\.ico$', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico')),
    ]

    # Serve static and media files from development server
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if not settings.DEBUG:
    urlpatterns += [
        url(r'^silk/', include('silk.urls', namespace='silk'))
    ]
lilfolr commented 6 years ago

Which settings file do you use when running your migrations? And, more importantly, does that settings file have DEBUG=True?

SalahAdDin commented 6 years ago

@lilfolr, yes. I'm using DEBUG = True, but I'm putting silk in the production file, and the middleware is in the base file.

lilfolr commented 6 years ago

If DEBUG = True when you run the migrations the it will throw a NoReverseMatch exception because your urls.py won't add in the silk URL & namespace. The fix here is to either:

  1. Move url(r'^silk/', include('silk.urls', namespace='silk')) up to around line 30, so it is always in your url urlpatterns or
  2. Set DEBUG = False when running your migration scripts
bebosudo commented 6 years ago

I'd like to say that I have the same problem on django 2.1 on python 3.6, django-silk-3.0.1 installed with pip.

I've added the following in my urls.py: urlpatterns.append(url("silk/", include("silk.urls")))

but I get the same errors as @SalahAdDin, with settings.DEBUG set to True or False: while I run the manage.py migrate (with DEBUG=False) I see:

  Applying silk.0002_auto_update_uuid4_id_field... OK
  Applying silk.0003_request_prof_file... OK
  Applying silk.0004_request_prof_file_storage... OK
  Applying silk.0005_increase_request_prof_file_length... OK
  Applying silk.0006_fix_request_prof_file_blank... OK
jmstp commented 6 years ago

I had the same problem but it was fixed adding the urls correctly.

Is there any known incompatibility between django-debug-toolbar and django-silk?

bebosudo commented 6 years ago

Sorry @jmstp, what do you mean "adding the urls correctly"? I did as said in the README: urlpatterns.append(url("silk/", include("silk.urls"))) and runserver/migrate crashes..

jmstp commented 6 years ago

What I did was put the three parts in debug mode an none in production.

url + app + middleware => debug none => prod

I put silk before debug_toobar

SalahAdDin commented 6 years ago

@jmstp Can you provide us the code, please?