Tôi muốn xem Thanh công cụ gỡ lỗi Django khi truy cập trang web sản xuất đang chạy Django 1.6. Máy chủ của tôi đang chạy Debian 7.8, Nginx 1.2.1 và Gunicorn 19.1.1. Tuy nhiên, khi tôi cố gắng truy cập vào các trang web sau khi thêm DDT để cài đặt ứng dụng của tôi, tôi nhận được lỗi sau:django-debug-toolbar sẽ không hiển thị từ máy chủ sản xuất
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' %}"
Tôi biết nó không được khuyến khích mà bạn chạy thanh công cụ trong sản xuất nhưng tôi chỉ muốn chạy nó trong khi Tôi làm một số thử nghiệm trên máy chủ sản xuất của tôi trước khi mở nó cho sử dụng công cộng. Như bạn có thể mong đợi, nó hoạt động tốt trong môi trường phát triển của tôi trên máy tính xách tay của tôi. Tôi đã thực hiện một số nghiên cứu và đảm bảo rằng tôi đang sử dụng "explicit" setup như được đề xuất here. Tôi cũng chạy lệnh "django-admin.py collectstatic" để đảm bảo các tệp tĩnh của thanh công cụ được thu thập vào STATIC_ROOT của tôi.
Vì tôi đang chạy phía sau máy chủ proxy, tôi cũng thêm một số phần mềm trung gian để đảm bảo rằng địa chỉ IP của khách hàng đang được chuyển đến phần giữa của thanh công cụ thay vì địa chỉ IP của proxy của tôi. Điều đó cũng không khắc phục được vấn đề.
Tôi hiển thị tất cả các cài đặt có vẻ phù hợp với vấn đề này bên dưới. Có cái gì khác tôi đang mất tích?
Cảm ơn!
Đây là những thiết lập cơ sở thích hợp:
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',
)
Các thiết lập này sản xuất chỉ được thêm vào các thiết lập cơ sở sản xuất:
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
}
Đây là trong urls.py tôi:
if 'debug_toolbar' in dev.INSTALLED_APPS:
import debug_toolbar
urlpatterns += patterns('',
url(r'^__debug__/', include(debug_toolbar.urls)),
)
Đây là phần mềm trung gian bổ sung:
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
Tối nay tôi phát hiện ra rằng khi tôi thêm DISABLE_PANELS và các thiết lập SHOW_TEMPLATE_CONTEXT như trình bày ở trên, lỗi NoReverseMatch ra đi nhưng DDT vẫn không xuất hiện trong trình duyệt của mình. – William
Tôi nghĩ rằng lý do tôi không thể nhìn thấy thanh công cụ là bởi vì tôi là đằng sau Nginx mà là một proxy ngược lại. Thanh công cụ chỉ có thể được nhìn thấy bởi các địa chỉ IP được đặt trong cài đặt INTERNAL_IPS. Tôi sẽ kiểm tra điều này vào ngày mai. – William
Thêm phần mềm trung gian để đảm bảo rằng địa chỉ của khách hàng được chuyển từ Nginx sang phần mềm trung gian DDT không giải quyết được vấn đề. Tôi đã cập nhật mã của mình ở trên để hiển thị phần mềm trung gian mới này. – William