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