2015-01-29 19 views
5

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

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

+1

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

+0

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

Trả lời

0

Vì vậy, django-debug-toolbar cũng sử dụng JavaScript để chạy. bạn đã xác nhận bạn có n tập lệnh JS xung đột ảnh hưởng đến thiết lập của bạn chưa? Tôi đã có một thời gian địa ngục với một dự án sử dụng DjDT và nó là một kịch bản back-to-top đã can thiệp ...

Ngoài ra, tôi biết bạn có rất nhiều mã để xử lý tình trạng proxy của bạn, nhưng có bạn uan nó thẳng ra khỏi hộp để xem nếu điều đó hoạt động trên máy chủ của bạn? Tôi có thể tạo một virtualenv mới, bắt đầu từ đầu và đảm bảo nó hoạt động trên máy chủ của bạn và sau đó tiếp tục thêm ứng dụng và cấu hình bổ sung.

Đây có lẽ là những gì bạn đã nghĩ đến nhưng tôi nghĩ tôi vẫn sẽ thêm chúng vì câu hỏi của bạn chưa nhận được nhiều hành động.

Chúc may mắn.

3

Tôi đang sử dụng chính xác thiết lập tương tự như mô tả OP, với ngoại lệ đáng chú ý khi chạy mọi thứ trong vùng chứa Docker riêng biệt làm cho IP của từng dịch vụ khó dự đoán.

Đây là cách bạn buộc Django debug toolbar để luôn hiển thị (chỉ sử dụng này tại địa phương, không bao giờ sản xuất):

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

DEBUG_TOOLBAR_CONFIG = { 
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar, 
} 
4

Trên thực tế, bạn không nên đặt DEBUG-True trên máy chủ sản xuất của bạn, giữ nó False và kiểm tra giải pháp của tôi dưới đây:

các callback DDT mặc định (debug_toolbar.middleware.show_toolbar) kiểm tra được rằng DEBUG phải được thiết lập để True, IP được yêu cầu phải nằm trong INTERNAL_IPS và yêu cầu không được là yêu cầu AJAX.

Chúng tôi có thể cung cấp callback riêng của chúng tôi mà không bao gồm các điều kiện DEBUG thiết lập:

cài đặt:

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 
} 

Bạn có thể kiểm tra HTTP_X_FORWARDED_FOR nếu bạn muốn quá, đó là tùy thuộc vào bạn.

url:

if 'debug_toolbar' in settings.INSTALLED_APPS: 
    import debug_toolbar 

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

tôi phải thêm dòng sau vào file url.py dự án để khắc phục vấn đề. Sau đó thanh công cụ gỡ lỗi được hiển thị.

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)), 
      ) 
Các vấn đề liên quan