django-debug-toolbar不能从生产服务器显示

时间:2015-01-29 23:57:18

标签: django nginx gunicorn

我想在访问运行Django 1.6的生产网站时查看Django调试工具栏。我的服务器运行的是Debian 7.8,Nginx 1.2.1和Gunicorn 19.1.1。但是,当我在安装的应用程序中添加DDT后尝试访问该站点时,出现以下错误:

NoReverseMatch at /
u'djdt' is not a registered namespace
Exception Location: /home/mysite/venv/mysite/local/lib/python2.7/site-packages/django/core/urlresolvers.py in reverse, line 505

Error during template rendering
In template /home/mysite/venv/mysite/local/lib/python2.7/site-packages/debug_toolbar/templates/debug_toolbar/base.html, error at line 12

data-store-id="{{ toolbar.store_id }}" data-render-panel-url="{% url 'djdt:render_panel' %}"

我知道不建议您在生产中运行工具栏,但我只是想在我打开公共用途之前在生产服务器上进行一些测试时运行它。正如您所料,它在我的笔记本电脑上的开发环境中运行良好。我做了一些研究并确保我使用"explicit" setup作为推荐here。我还运行了命令“django-admin.py collectstatic”以确保工具栏的静态文件被收集到我的STATIC_ROOT中。

由于我在代理服务器后面运行,我还添加了一些中间件以确保客户端的IP地址被传递到工具栏的中间件而不是我的代理的IP地址。这也没有解决问题。

我正在显示以下与此问题相关的所有设置。还有其他我想念的东西吗?

谢谢!

以下是相关的基本设置:

SETTINGS_ROOT = os.path.abspath(os.path.dirname(__file__).decode('utf-8'))
STATIC_ROOT = '/var/www/mysite/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(SETTINGS_ROOT, "../../static"),
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.common.BrokenLinkEmailsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_ROOT, "../../templates"),
)
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Django management commands in 'scripts'
    'scripts',
    'apps.account',
)

这些仅限生产的设置会添加到生产中的基本设置中:

DEBUG = True  # DDT needs this to be True
TEMPLATE_DEBUG = DEBUG
INSTALLED_APPS += (
    'django_extensions',
    # I'm using Django 1.6
    'debug_toolbar',  
)
if 'debug_toolbar' in INSTALLED_APPS:
MIDDLEWARE_CLASSES += ('conf.middleware.DjangoDebugToolbarFix', 
                       'debug_toolbar.middleware.DebugToolbarMiddleware', )

    # I had to add this next setting after upgrading my OS to Mavericks
    DEBUG_TOOLBAR_PATCH_SETTINGS = False
    # IP for laptop and external IP needed by DDT
    INTERNAL_IPS = ('76.123.67.152', )
    DEBUG_TOOLBAR_CONFIG = {
       'DISABLE_PANELS': [
           'debug_toolbar.panels.redirects.RedirectsPanel',
        ],
       'SHOW_TEMPLATE_CONTEXT': True,
       'INTERCEPT_REDIRECTS': False
    }

这是在我的urls.py中:

if 'debug_toolbar' in dev.INSTALLED_APPS:
    import debug_toolbar
    urlpatterns += patterns('',
        url(r'^__debug__/', include(debug_toolbar.urls)),
    )

以下是其他中间件:

class DjangoDebugToolbarFix(object):
    """Sets 'REMOTE_ADDR' based on 'HTTP_X_FORWARDED_FOR', if the latter is
    set."""
    def process_request(self, request):
        if 'HTTP_X_FORWARDED_FOR' in request.META:
            ip = request.META['HTTP_X_FORWARDED_FOR'].split(",")[0].strip()
            request.META['REMOTE_ADDR'] = ip

5 个答案:

答案 0 :(得分:5)

实际上,您不应该在生产服务器上将DEBUG设置为True,并保留False并检查我的解决方案:

默认的DDT回调(debug_toolbar.middleware.show_toolbar)检查是DEBUG必须设置为True,请求的IP必须在INTERNAL_IPS,并且请求必须不是AJAX请求。

我们可以提供自己的回调,排除DEBUG设置条件:

设置:

INTERNAL_IPS = ['YOUR.IP.ADDRESS.HERE']  # put your client IP address here (not server IP!)

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda request: not request.is_ajax() and request.META.get('REMOTE_ADDR', None) in INTERNAL_IPS
}

如果您愿意,也可以查看HTTP_X_FORWARDED_FOR,这取决于您。

<强>网址:

if 'debug_toolbar' in settings.INSTALLED_APPS:
    import debug_toolbar

    urlpatterns += [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

答案 1 :(得分:3)

我正在使用与OP描述完全相同的设置,除了在单独的Docker容器中运行所有内容之外,这使得每个服务的IP难以预测。

这就是强制Django调试工具栏始终显示的方式(仅在本地使用,从不在生产中使用):

def custom_show_toolbar(request):
    return True # Always show toolbar, for example purposes only.

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
}

答案 2 :(得分:0)

因此django-debug-toolbar也使用JavaScript运行。你确认你有没有冲突的JS脚本影响你的设置吗?我有一个时间用一个项目使用DjDT,这是一个干扰的回到顶部的脚本...

另外,我知道你有很多额外的代码来处理你的代理情况,但你是否可以直接开箱即可看看它是否适用于你的服务器?我可能会创建一个新的virtualenv,从头开始并确保它在您的服务器上运行,然后继续添加应用程序和其他配置。

这些可能是你想到过的事情,但我认为无论如何我都要添加它们,因为你的问题还没有收到很多动作。

祝你好运。

答案 3 :(得分:0)

我必须将以下内容添加到项目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)),
              )

答案 4 :(得分:0)

如果您在docker上,以下代码可帮助我获取内部ip。

# Debug Toolbar
if DEBUG:
    import os
    import socket
    hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
    INTERNAL_IPS = [ip[:-1] + '1' for ip in ips] + ['127.0.0.1', '10.0.2.2', ]

贷方到此https://gist.github.com/douglasmiranda/9de51aaba14543851ca3#file-option2-py

此答案还有其他选择:https://stackoverflow.com/a/49818040/317346