【问题标题】:django-debug-toolbar not showing updjango-debug-toolbar 没有出现
【发布时间】:2012-05-18 01:36:49
【问题描述】:

我看了其他问题也想不通……

我做了以下安装 django-debug-toolbar:

  1. pip install django-debug-toolbar
  2. 添加到中间件类:
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
)

3 添加了 INTERNAL_IPS:

INTERNAL_IPS = ('174.121.34.187',)

4 为已安装的应用添加了 debug_toolbar

我没有收到任何错误或任何东西,工具栏没有显示在任何页面上,甚至管理员也没有。

我什至将 debug_toolbar 模板的目录添加到我的TEMPLATE_DIRS

【问题讨论】:

  • 如果您使用 Vagrant,请确保您的 INTERNAL_IPS 正确。检查的一种方法是在视图中打印您的request.META['REMOTE_ADDR'],然后将其添加到您的INTERNAL_IPS
  • 这可能对某人有所帮助。我尝试在内部 IP 中添加 '*',但这不起作用。您必须输入特定的 IP。
  • 在我的 settings.py 中,现在只有 MIDDLEWARE,而不是 MIDDLEWARE_CLASSES
  • 您应该尽早在列表中包含调试工具栏中间件。根据django-debug-toolbar.readthedocs.io/en/latest/installation.html

标签: python django django-debug-toolbar


【解决方案1】:

一切都完成了,但在 Chrome 中没有显示“django 调试工具栏”。

Chrome 控制台:无法加载模块脚本:需要一个 JavaScript 模块脚本,但服务器以“text/plain”的 MIME 类型响应。根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查。 (toolbar.js;1)

在 EDGE 中,显示的工具栏与服务器和 url 完全相同。

【讨论】:

    【解决方案2】:
    1. 就像你说的那样,我已经配置了文档中所说的所有内容,但 debug_toolbar 仍然没有出现。 然后我在 Firefox 中试了一下,效果很好。

    2. 然后从 chrome,我检查网页并更改类名 class="djdt-hidden"。您可以尝试更改或删除它。

    3. 运行manage.py collectstatic并重复上述步骤

    4. 其实你可以通过编辑跳过第 2 步和第 3 步

      .djdt-hidden{ display: none;}

      从路径

      debug_toolbar/static/debug_toolbar/css/toolbar.css

    5. 在 settings.py 中的某处添加这两行

      import mimetypes

      mimetypes.add_type("application/javascript", ".js", True)

    6. 在 urls.py 中

      import debug_toolbar

      urlpatterns += [ path('__debug__/', include(debug_toolbar.urls)),]

    7. 使用参考django debug toolbar installation

    1. 如果它仍然无法正常工作, 创建 launch.json 并提及不同的端口号进行调试

    ` {

    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "Python: Django",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}\\manage.py",
            "args": [
                "runserver",
                "9000",
            ],
            "django": true
        }
    ]
    

    } `

    【讨论】:

      【解决方案3】:

      运行以下命令:

      python manage.py migrate
      

      现在再次运行服务器

      【讨论】:

        【解决方案4】:

        如果您使用的是 Windows,它可能来自您的注册表。 将 HKEY_CLASSES_ROOT.js\Content Type 设置为 text/javascript 而不是 text/plain。

        【讨论】:

          【解决方案5】:

          Docker

          如果您在带有 docker 的 Docker 容器中使用 Django 服务器进行开发,则启用工具栏的说明不起作用。原因在于您需要添加到INTERNAL_IPS 的实际地址将是动态的,例如 172.24.0.1。 与其尝试动态设置 INTERNAL_IPS 的值,直接的解决方案是替换启用工具栏的功能,在您的 settings.py 中,例如:

          DEBUG_TOOLBAR_CONFIG = {
              'SHOW_TOOLBAR_CALLBACK': lambda _request: DEBUG
          }
          

          这也适用于其他动态路由情况,例如 Vagrant 或 Heroku。

          这里有更多细节供好奇的人参考。 django_debug_tool 中确定是否显示工具栏的代码检查REMOTE_ADDR 的值,如下所示:

          if request.META.get('REMOTE_ADDR', None) not in INTERNAL_IPS:
                 return False
          

          因此,如果由于动态 docker 路由而实际上不知道 REMOTE_ADDR 的值,则工具栏将不起作用。可以使用 docker network 命令查看动态 IP 值,例如 docker network inspect my_docker_network_name

          【讨论】:

          • 我在 heroku 上托管,这是唯一有效的方法
          • 晦涩难懂,但是当我设置 DEBUG=True 然后运行 ​​DRF APIClient 端点测试时,我遇到了异常(TypeError: 'SQLPanel' object is not subscriptableKeyError: 'djdt'django.urls.exceptions.NoReverseMatch: 'djdt' is not a registered namespace)。我使用if settings.DEBUG 有条件地将调试工具栏urlpatterns 添加到urls.py。因为 Django 在测试期间设置了DEBUG=False,但似乎只是在之后 settings.py 被导入,应用程序和中间件正在安装并且工具栏被强制显示,但缺少所需的urlpatterns。
          【解决方案6】:

          有同样的问题 添加后

          urls.py
          mimetypes.add_type("application/javascript", ".js", True)
          urlpatterns = [...
          

          DEBUG_TOOLBAR_CONFIG = {
           'INTERCEPT_REDIRECTS': False,
           'SHOW_TOOLBAR_CALLBACK': lambda request: True,
           'SHOW_TEMPLATE_CONTEXT': True,
           'INSERT_BEFORE': '</head>'
          }
          

          添加了javascripts文件,但所有标签都有djdt-hidden类和隐藏

          &lt;div id="djDebug" class="djdt-hidden" dir="ltr" data-default-show="true"&gt;

          我使用的是GoogleChrome

          FireFox 中的错误已修复并出现 django 工具栏图标

          【讨论】:

            【解决方案7】:

            它对我有用。

            #urls.py
            if settings.DEBUG:
                from django.conf.urls.static import static
                import debug_toolbar
                import mimetypes
            
                mimetypes.add_type("application/javascript", ".js", True)
            
                urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
                urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
            
                urlpatterns = [path('__debug__/', include(debug_toolbar.urls)), ] + urlpatterns
            

            【讨论】:

              【解决方案8】:

              经过多次试验和错误,这在 Django=3.1 中对我有用 写完所有的internal_ip,中间件,附加在url中,把这段代码放到settings.py下面

              def show_toolbar(request):
              return True
              
              
              DEBUG_TOOLBAR_CONFIG = {
              "SHOW_TOOLBAR_CALLBACK": show_toolbar,
              'INSERT_BEFORE': '</head>'
              }
              

              他们中的许多人建议 SHOW_TOOLBAR_​​CALLBACK,但在我的情况下,它只有在添加 'INSERT_BEFORE' 后才有效

              【讨论】:

                【解决方案9】:

                我知道这个问题有点老了,但是今天我用 docker 安装了 django-toolbar 并遇到了同样的问题,这为我解决了它

                INTERNAL_IPS = ["127.0.0.1", "10.0.2.2"]
                
                import socket
                hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
                INTERNAL_IPS += [".".join(ip.split(".")[:-1] + ["1"]) for ip in ips]
                

                正如我在评论中看到的,问题是 docker 使用动态 ip,为了解决这个问题,我们可以从上面的代码中获取 ip

                【讨论】:

                  【解决方案10】:

                  让我着迷的是一个过时的浏览器!

                  注意到它从调试工具栏加载了一些样式表,并猜测这可能是前端问题。

                  【讨论】:

                    【解决方案11】:

                    在我正在处理的代码中,在处理主请求期间发出了多个小请求(这是非常具体的用例)。它们是由同一个 Django 线程处理的请求。 Django 调试工具栏 (DjDT) 不会出现这种行为,并在第一个响应中包含 DjDT 的工具栏,然后它会删除线程的状态。因此,当主请求被发送回浏览器时,响应中不包含 DjDT。

                    经验教训:DjDT 保存每个线程的状态。它会在第一次响应后删除线程的状态。

                    【讨论】:

                      【解决方案12】:

                      django 1.8.5:

                      我必须将以下内容添加到项目 url.py 文件中才能显示调试工具栏。之后显示调试工具栏。

                       from django.conf.urls import include
                       from django.conf.urls import patterns
                       from django.conf import settings
                      
                      
                        if settings.DEBUG:
                            import debug_toolbar
                            urlpatterns += patterns('',
                                    url(r'^__debug__/', include(debug_toolbar.urls)),
                                    )
                      

                      django 1.10: 及更高版本:

                      from django.conf.urls import include, url
                      from django.conf.urls import patterns
                      from django.conf import settings
                      
                      
                      if settings.DEBUG:
                      
                        import debug_toolbar
                        urlpatterns =[
                               url(r'^__debug__/', include(debug_toolbar.urls)),
                               ] + urlpatterns
                      

                      也不要忘记将 debug_toolbar 包含到您的中间件中。 调试工具栏主要在中间件中实现。在您的设置模块中启用它,如下所示: (django 较新版本)


                      MIDDLEWARE = [
                      # ...
                      'debug_toolbar.middleware.DebugToolbarMiddleware',
                      #
                      

                      老式中间件:(中间件需要有_CLASSES键)

                      MIDDLEWARE_CLASSES = [
                      # ...
                      'debug_toolbar.middleware.DebugToolbarMiddleware',
                      # ...
                      ]
                      

                      【讨论】:

                        【解决方案13】:

                        在我的情况下,我只需要删除 python 编译文件 (*.pyc)

                        【讨论】:

                        • 感谢您的评论,它让我今天早上精神崩溃。如果其他一切看起来都正确——而且这个项目以前对我来说还不错——试试这个,看看它是否能解决它。 DDT HTML/JS 在页面上,一切看起来都很好,但实际上仍然没有显示出来。我清除了 pyc 文件,它又开始出现了
                        【解决方案14】:

                        我尝试了一切,从设置DEBUG = True,到设置INTERNAL_IPS 到我的客户端的IP 地址,甚至手动配置Django 调试工具栏(请注意,最近的版本会自动进行所有配置,例如添加中间件和URL)。在远程开发服务器中没有任何工作(尽管它在本地工作)。 唯一有效的方法是按如下方式配置工具栏:

                        DEBUG_TOOLBAR_CONFIG = {
                            "SHOW_TOOLBAR_CALLBACK" : lambda request: True,
                        }
                        

                        这替换了决定是否显示工具栏的默认方法,并且始终返回 true。

                        【讨论】:

                          【解决方案15】:

                          对于使用 Pycharm 5 的任何人 - 模板调试在某些版本中不起作用。在 5.0.4 中修复,受影响的版本 - 5.0.1、5.0.2 查看issue

                          花费大量时间来找出答案。也许会帮助某人

                          【讨论】:

                            【解决方案16】:

                            我遇到了这个问题,不得不从源代码安装调试工具栏。

                            如果您使用 PureCSS 和其他 CSS 框架,1.4 版会出现隐藏问题。

                            This 是修复该问题的提交。

                            文档解释了如何从源代码安装。

                            【讨论】:

                              【解决方案17】:

                              我在使用 Vagrant 时遇到了同样的问题。我通过将::ffff:192.168.33.1 添加到 INTERNAL_IPS 解决了这个问题,如下例所示。

                              INTERNAL_IPS = (
                                  '::ffff:192.168.33.1',
                              )
                              

                              记住192.168.33.10 是我在 Vagrantfile 中的专用网络中的 IP。

                              【讨论】:

                                【解决方案18】:

                                愚蠢的问题,但你没有提到它,所以...DEBUG 设置为什么?除非是 True,否则它不会加载。

                                如果仍然无法正常工作,请尝试将“127.0.0.1”也添加到 INTERNAL_IPS

                                更新

                                这是最后的努力,您不应该必须这样做,但它会清楚地显示是否只是一些配置问题或是否存在一些更大的问题。

                                将以下内容添加到settings.py:

                                def show_toolbar(request):
                                    return True
                                SHOW_TOOLBAR_CALLBACK = show_toolbar
                                

                                这将有效地删除调试工具栏的所有检查,以确定它是否应该自行加载;它总是会加载。仅将其保留用于测试目的,如果您忘记并使用它启动,所有访问者也将看到您的调试工具栏。

                                有关显式配置,另请参阅官方安装文档here

                                编辑(2015 年 6 月 17 日):

                                显然,核选项的语法已更改。它现在在自己的字典中:

                                def show_toolbar(request):
                                    return True
                                DEBUG_TOOLBAR_CONFIG = {
                                    "SHOW_TOOLBAR_CALLBACK" : show_toolbar,
                                }
                                

                                他们的tests 使用这本词典。

                                【讨论】:

                                • 是的,所以这里发生了一些更大的问题。如果您使用的不是runserver,请确保重新启动它。哎呀,也重新启动runserver。确保您对 settings.py 的更改实际上已保存/提交。您可能想尝试删除 *.pyc 文件。在 *nix 中,您只需使用项目根目录中的 find . -name "*.pyc" -exec rm {} \; 即可完成此操作。最后,运行python manage.py shell并执行from django.conf import settings并检查settings.INSTALLED_APPs的值。
                                • 我不确定你对最后一个问题的意思,但如果你指的是INTERNAL_IPS,那么这些是针对客户端而不是服务器(Django)的。换句话说,您输入 您的 IP 地址,以便 可以看到调试工具栏,无论该站点可能在哪个 IP 上运行。
                                • INTERNAL_IPS 也得到了我。感谢您提供的信息
                                • 甚至SHOW_TOOLBAR_CALLBACK = lambda x: True
                                • @schillingt 是的,很抱歉,我应该检查一下。我想我必须运行 collectstatic 才能让所有内容都显示出来。
                                【解决方案19】:

                                在 Windows 上将 10.0.2.2 添加到您的 INTERNAL_IPS,它在内部与 vagrant 一起使用

                                INTERNAL_IPS = ( '10.0.2.2', )

                                这应该可行。

                                【讨论】:

                                • 确认这解决了我在 OSX 上使用 Vagrant 的问题。
                                • 这是最正确和最可能的解决方案,也是最简单的一个 :) 确认在 windows 7 上使用 vagrant 工作
                                【解决方案20】:

                                在我的例子中,这里还没有提到另一个问题:我的中间件列表中有 GZipMiddleware。

                                由于调试工具栏的自动配置将调试工具栏的中间件放在顶部,它只能“看到”压缩后的 HTML,无法添加工具栏。

                                我在开发设置中删除了 GZipMiddleware。手动设置调试工具栏的配置并将中间件放在 GZip 之后也应该可以工作。

                                【讨论】:

                                【解决方案21】:

                                我尝试了 pydanny's cookiecutter-django 的配置,它对我有用:

                                # django-debug-toolbar
                                MIDDLEWARE_CLASSES = Common.MIDDLEWARE_CLASSES + ('debug_toolbar.middleware.DebugToolbarMiddleware',)
                                INSTALLED_APPS += ('debug_toolbar',)
                                
                                INTERNAL_IPS = ('127.0.0.1',)
                                
                                DEBUG_TOOLBAR_CONFIG = {
                                    'DISABLE_PANELS': [
                                        'debug_toolbar.panels.redirects.RedirectsPanel',
                                    ],
                                    'SHOW_TEMPLATE_CONTEXT': True,
                                }
                                # end django-debug-toolbar
                                

                                我只是通过添加'debug_toolbar.apps.DebugToolbarConfig' 而不是official django-debug-toolbar docs 中提到的'debug_toolbar' 来修改它,因为我使用的是Django 1.7。

                                【讨论】:

                                  【解决方案22】:

                                  对先前答案的补充:

                                  如果工具栏没有显示,但它在 html 中加载(在浏览器中检查您的网站 html,向下滚动)

                                  问题可能是找不到调试工具栏静态文件(您也可以在网站的访问日志中看到这一点,例如 /static/debug_toolbar/js/toolbar.js 的 404 错误)

                                  然后可以通过以下方式修复(nginx和apache的示例):

                                  nginx 配置:

                                  location ~* ^/static/debug_toolbar/.+.(ico|css|js)$ {
                                      root [path to your python site-packages here]/site-packages/debug_toolbar;
                                  }
                                  

                                  apache 配置:

                                  Alias /static/debug_toolbar [path to your python site-packages here]/site-packages/debug_toolbar/static/debug_toolbar
                                  

                                  或者:

                                  manage.py collectstatic
                                  

                                  更多关于 collectstatic 的信息:https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#collectstatic

                                  或手动将 debug_toolbar 静态文件的 debug_toolbar 文件夹移动到您设置的静态文件文件夹中

                                  【讨论】:

                                    【解决方案23】:

                                    调试工具栏希望在 INTERNAL_IPS 设置中设置 request.META['REMOTE_ADDR'] 中的 IP 地址。在您的其中一个视图中添加打印语句,如下所示:

                                    print("IP Address for debug-toolbar: " + request.META['REMOTE_ADDR'])
                                    

                                    然后加载该页面。确保 IP 在 settings.py 中的 INTERNAL_IPS 设置中。

                                    通常我认为您可以通过查看计算机的 IP 地址轻松确定地址,但在我的情况下,我在带有端口转发的 Virtual Box 中运行服务器......谁知道发生了什么.尽管在 VB 或我自己的操作系统上的 ifconfig 中没有看到它,但 REMOTE_ADDR 键中显示的 IP 是激活工具栏的诀窍。

                                    【讨论】:

                                    • 我通过 nginx 代理传递进入我的页面,所以 remote_addr 是我的代理,而不是我的真实 IP。我需要将我的代理 IP 地址添加到 INTERNAL_IPS 并且它开始工作。
                                    • 从我在 VirtualBox 中的访客机器上,我的主机被视为 10.0.0.2,如果它可以帮助某人的话。 :)
                                    • 如果您使用 VAGRANT 之类的虚拟化,检查 IP 非常有用
                                    • 在 docker 中,我的 REMOTE_ADDR 不是我想象的那样。
                                    【解决方案24】:

                                    我遇到了同样的问题,我通过查看 Apache 的错误日志解决了它。 我用 mod_wsgi 在 mac os x 上运行了 apache 未加载 debug_toolbar 的 tamplete 文件夹

                                    日志示例:

                                    ==> /private/var/log/apache2/dummy-host2.example.com-error_log <==
                                    [Sun Apr 27 23:23:48 2014] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/rblreport/rbl/static/debug_toolbar, referer: http://127.0.0.1/
                                    
                                    ==> /private/var/log/apache2/dummy-host2.example.com-access_log <==
                                    127.0.0.1 - - [27/Apr/2014:23:23:48 -0300] "GET /static/debug_toolbar/css/toolbar.css HTTP/1.1" 404 234 "http://127.0.0.1/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:28.0) Gecko/20100101 Firefox/28.0"
                                    

                                    我只是将这一行添加到我的 VirtualHost 文件中:

                                    Alias /static/debug_toolbar /Library/Python/2.7/site-packages/debug_toolbar/static/debug_toolbar
                                    
                                    • 当然你必须改变你的python路径

                                    【讨论】:

                                      【解决方案25】:

                                      对我来说,这就像在地址栏中输入 127.0.0.1:8000 一样简单,而不是显然与 INTERNAL_IPS 不匹配的 localhost:8000

                                      【讨论】:

                                        【解决方案26】:

                                        当前的稳定版本 0.11.0 需要满足以下条件才能显示工具栏:

                                        设置文件:

                                        1. DEBUG = True
                                        2. INTERNAL_IPS 包含您的浏览器 IP 地址,而不是服务器地址。如果在本地浏览,这应该是INTERNAL_IPS = ('127.0.0.1',)。如果远程浏览只是specify your public address
                                        3. 要安装的 debug_toolbar 应用程序,即INSTALLED_APPS = (..., 'debug_toolbar',)
                                        4. 要添加的调试工具栏中间件类,即MIDDLEWARE_CLASSES = ('debug_toolbar.middleware.DebugToolbarMiddleware', ...)。应尽早将其放在列表中。

                                        模板文件:

                                        1. 必须是text/html类型
                                        2. 必须有一个结束 &lt;/html&gt; 标记

                                        静态文件:

                                        如果您提供静态内容,请确保通过以下方式收集 css、js 和 html:

                                        ./manage.py collectstatic 
                                        


                                        关于即将发布的 django-debug-toolbar 版本的说明

                                        较新的开发版本添加了设置点 2、3 和 4 的默认值,这使生活变得更简单,但是,与任何开发版本一样,它都有错误。我发现来自 git 的最新版本在通过 nginx/uwsgi 运行时导致了 ImproperlyConfigured 错误。

                                        无论哪种方式,如果您想从 github 安装最新版本,请运行:

                                        pip install -e git+https://github.com/django-debug-toolbar/django-debug-toolbar.git#egg=django-debug-toolbar 
                                        

                                        您还可以通过执行以下操作克隆特定提交:

                                        pip install -e git+https://github.com/django-debug-toolbar/django-debug-toolbar.git@ba5af8f6fe7836eef0a0c85dd1e6d7418bc87f75#egg=django_debug_toolbar
                                        

                                        【讨论】:

                                        • 实际上它的 标签不是
                                        【解决方案27】:

                                        另一个可能导致工具栏保持隐藏的情况是它找不到所需的静态文件。 debug_toolbar 模板使用 {{ STATIC_URL }} 模板标签,因此请确保您的静态文件中有一个名为 debug toolbar 的文件夹。

                                        collectstatic 管理命令应该在大多数安装中处理这个问题。

                                        【讨论】:

                                          【解决方案28】:

                                          你必须确保你的模板中有一个结束标签。

                                          我的问题是我的模板中没有常规的 html 标签,我只是以纯文本显示内容。我通过从base.html继承每个html文件来解决它,它有一个标签。

                                          【讨论】:

                                            【解决方案29】:

                                            对于这个特定的作者来说不是这种情况,但我一直在努力解决没有显示调试工具栏的问题,在做了他们指出的一切之后,我发现这是 MIDDLEWARE 顺序的问题。因此,将中间件放在列表的前面可能会起作用。我的是第一:

                                            MIDDLEWARE_CLASSES = ( 'debug_toolbar.middleware.DebugToolbarMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'dynpages.middleware.DynpageFallbackMiddleware', 'utils.middleware.UserThread', )

                                            【讨论】:

                                              【解决方案30】:

                                              我遇到了一件愚蠢的事情。如果您使用 apache wsgi,请记住触摸 .wsgi 文件以强制重新编译您的代码。只是浪费我 20 分钟的时间来调试这个愚蠢的错误:(

                                              【讨论】:

                                                猜你喜欢
                                                • 2015-05-13
                                                • 2013-12-07
                                                • 2011-08-05
                                                • 2014-05-10
                                                • 2021-07-15
                                                • 2022-08-13
                                                • 1970-01-01
                                                • 2016-04-08
                                                • 2013-01-15
                                                相关资源
                                                最近更新 更多