Я хотел бы просмотреть панель инструментов Django Debug при доступе к моему веб-сайту, на котором работает Django 1.6. На моем сервере запущены Debian 7.8, Nginx 1.2.1 и Gunicorn 19.1.1. Однако, когда я пытаюсь получить доступ к сайту после добавления DDT моих установленных приложений, я получаю следующее сообщение об ошибке:django-debug-toolbar не будет отображаться с производственного сервера
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
Сегодня я обнаружил, что, когда я добавил DISABLE_PANELS и настройку SHOW_TEMPLATE_CONTEXT, как показан выше, ошибка NoReverseMatch ушла, но DDT по-прежнему не появляется в моем браузере. – William
Я думаю, что причина, по которой я не вижу панель инструментов, - это то, что я отстаю от Nginx, который является обратным прокси. Панель инструментов можно увидеть только по IP-адресам, установленным в настройке INTERNAL_IPS. Я проверю это завтра. – William
Добавление промежуточного программного обеспечения для обеспечения передачи адреса клиента из Nginx в промежуточное ПО DDT не решило проблему. Я обновил свой код выше, чтобы показать это новое промежуточное ПО. – William