2015-01-29 2 views
5

Ich möchte die Django Debug Toolbar anzeigen, wenn ich auf meine Produktionswebsite mit Django 1.6 zugreife. Auf meinem Server laufen Debian 7.8, Nginx 1.2.1 und Gunicorn 19.1.1. Allerdings, wenn ich versuche, auf die Website zugreifen, nachdem DDT meine installierten Anwendungen hinzufügen, bekomme ich folgende Fehlermeldung:django-debug-toolbar wird nicht vom Produktionsserver angezeigt

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' %}" 

Ich weiß, es wird nicht empfohlen, dass Sie die Symbolleiste in der Produktion laufen, aber ich will es einfach laufen, während Ich teste einige Tests auf meinem Produktionsserver, bevor ich ihn für die Öffentlichkeit öffne. Wie Sie vielleicht erwarten, funktioniert es in meiner Entwicklungsumgebung auf meinem Laptop gut. Ich habe etwas recherchiert und sichergestellt, dass ich die "explicit" setup wie empfohlen here verwende. Ich habe auch den Befehl "django-admin.py collectstatic" ausgeführt, um sicherzustellen, dass die statischen Dateien der Symbolleiste in meinem STATIC_ROOT gesammelt wurden.

Da ich hinter einem Proxy-Server laufe, habe ich auch eine Middleware hinzugefügt, um sicherzustellen, dass die IP-Adresse des Clients an die Middleware der Symbolleiste und nicht an die IP-Adresse meines Proxys übergeben wird. Das hat das Problem auch nicht behoben.

Ich zeige alle Einstellungen, die für dieses Problem relevant scheinen. Gibt es noch etwas, das mir fehlt?

Danke!

Dies sind die relevanten Grundeinstellungen:

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', 
) 

Diese produktions nur Einstellungen erhalten hinzugefügt Grundeinstellungen in der Produktion:

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 
    } 

Dies ist in meinem urls.py:

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

Hier ist die zusätzliche Middleware:

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 
+0

Heute Abend entdeckt, dass, wenn ich die DISABLE_PANELS und SHOW_TEMPLATE_CONTEXT Einstellungen hinzugefügt, wie oben gezeigt, die NoReverseMatch Fehler ging weg, aber die DDT noch nicht in meinem Browser erscheint. – William

+1

Ich denke, der Grund, warum ich die Symbolleiste nicht sehen kann, liegt darin, dass ich hinter Nginx, einem Reverse-Proxy, stehe. Die Symbolleiste kann nur von den IP-Adressen gesehen werden, die in der Einstellung INTERNAL_IPS festgelegt wurden. Ich werde das morgen überprüfen. – William

+0

Das Hinzufügen von Middleware, um sicherzustellen, dass die Clientadresse von Nginx an die DDT-Middleware übergeben wird, hat das Problem nicht gelöst. Ich habe meinen obigen Code aktualisiert, um diese neue Middleware anzuzeigen. – William

Antwort

0

So django-debug-toolbar verwendet JavaScript, um auch zu laufen. hast du bestätigt, dass du in Konflikt stehende JS-Skripts hast, die sich auf dein Setup auswirken? Ich hatte eine Hölle Zeit mit einem Projekt mit DjDT und es war ein Back-to-Top-Skript, das störte ...

Auch ich weiß, Sie haben viel zusätzlichen Code, um Ihre Proxy-Situation zu behandeln, aber haben Sie können es direkt aus der Box, um zu sehen, ob das auf Ihrem Server funktioniert? Ich könnte ein neues virtualenv erstellen, von vorne anfangen und sicherstellen, dass es auf Ihrem Server funktioniert und dann fügen Sie Apps und zusätzliche Konfiguration hinzu.

Dies sind wahrscheinlich Dinge, an die Sie gedacht haben, aber ich dachte, ich würde sie trotzdem hinzufügen, da Ihre Frage nicht viel Aktion erhalten hat.

Viel Glück.

3

Ich benutze genau das selbe Setup wie OP beschreibt, mit der bemerkenswerten Ausnahme, alles in einem separaten Docker Container laufen zu lassen, was die IP jedes Dienstes schwer voraussagbar macht.

Dies ist, wie Sie Django Debug Toolbar zwingen, immer zu zeigen (dies nur lokal, niemals in Produktion):

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

DEBUG_TOOLBAR_CONFIG = { 
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar, 
} 
4

Eigentlich sollte man nicht gesetzt DEBUG-True auf Produktion Server, halten sie es False und überprüfen sie meine Lösung unter:

der Standard DDT Rückruf (debug_toolbar.middleware.show_toolbar) überprüft werden, dass DEBUG muss True eingestellt werden, die IP des Antrags insein muss, und die Anfrage darf keine AJAX-Anfrage sein.

Wir können unsere eigenen Rückruf schaffen, die den Zustand DEBUG Einstellung ausschließt:

Einstellungen:

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 
} 

Sie können HTTP_X_FORWARDED_FOR überprüfen, wenn Sie zu wollen, ist es an Ihnen.

Urls:

if 'debug_toolbar' in settings.INSTALLED_APPS: 
    import debug_toolbar 

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

Ich hatte folgendes Projekt url.py Datei hinzufügen, um das Problem zu beheben. Danach wird die Debug-Symbolleiste angezeigt. Ich

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)), 
      )