2015-01-29 3 views
5

Я хотел бы просмотреть панель инструментов 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 
+0

Сегодня я обнаружил, что, когда я добавил DISABLE_PANELS и настройку SHOW_TEMPLATE_CONTEXT, как показан выше, ошибка NoReverseMatch ушла, но DDT по-прежнему не появляется в моем браузере. – William

+1

Я думаю, что причина, по которой я не вижу панель инструментов, - это то, что я отстаю от Nginx, который является обратным прокси. Панель инструментов можно увидеть только по IP-адресам, установленным в настройке INTERNAL_IPS. Я проверю это завтра. – William

+0

Добавление промежуточного программного обеспечения для обеспечения передачи адреса клиента из Nginx в промежуточное ПО DDT не решило проблему. Я обновил свой код выше, чтобы показать это новое промежуточное ПО. – William

ответ

0

Для этого django-debug-toolbar использует JavaScript для запуска. вы подтвердили, что у вас есть противоречивые сценарии JS, влияющие на вашу настройку? У меня было чертовски время с одним проектом, использующим DjDT, и это был второстепенный скрипт, который мешал ...

Кроме того, я знаю, что у вас есть много дополнительного кода для обработки вашей прокси-ситуации, но вы uan это прямо из коробки, чтобы узнать, работает ли это на вашем сервере? Я могу создать новый virtualenv, начать с нуля и убедиться, что он работает на вашем сервере, а затем перейти к добавлению приложений и дополнительной конфигурации.

Это, вероятно, то, о чем вы думали, но я думал, что добавлю их так или иначе, так как ваш вопрос не получил много действий.

Удачи.

3

Я использую ту же самую настройку, что описывает OP, за исключением заметного исключения работы в отдельном контейнере Docker, который делает IP-адрес каждой службы трудно предсказать.

Это, как вы заставляете Django Debug Toolbar всегда показывать (используйте это только в местном масштабе, никогда в производстве):

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

DEBUG_TOOLBAR_CONFIG = { 
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar, 
} 
4

На самом деле, вы не должны установить DEBUG в True на сервере производства, держать его False и проверить мое решение ниже:

ДДТ по умолчанию обратный вызов (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, если вы хотите тоже, это до вас.

URLs:

if 'debug_toolbar' in settings.INSTALLED_APPS: 
    import debug_toolbar 

    urlpatterns += [ 
     url(r'^__debug__/', include(debug_toolbar.urls)), 
    ] 
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)), 
      ) 
Смежные вопросы