django调试工具栏赢得';无法从生产服务器显示
我想在访问运行Django 1.6的生产网站时查看Django调试工具栏。我的服务器运行的是Debian 7.8、Nginx 1.2.1和Gunicorn 19.1.1。但是,当我在向已安装的应用程序添加DDT后尝试访问该网站时,会出现以下错误:django调试工具栏赢得';无法从生产服务器显示,django,nginx,gunicorn,Django,Nginx,Gunicorn,我想在访问运行Django 1.6的生产网站时查看Django调试工具栏。我的服务器运行的是Debian 7.8、Nginx 1.2.1和Gunicorn 19.1.1。但是,当我在向已安装的应用程序添加DDT后尝试访问该网站时,会出现以下错误: NoReverseMatch at / u'djdt' is not a registered namespace Exception Location: /home/mysite/venv/mysite/local/lib/python2.7/sit
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' %}"
我知道不建议您在生产环境中运行工具栏,但我只想在将其打开供公众使用之前,在我的生产服务器上进行一些测试时运行它。正如您所料,它在我的笔记本电脑上的开发环境中运行良好。我做了一些研究,并确保我使用的是推荐的。我还运行了命令“django-admin.py collectstatic”,以确保工具栏的静态文件被收集到我的静态根目录中
由于我在代理服务器后面运行,我还添加了一些中间件,以确保客户端的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
}
def custom_show_toolbar(request):
return True # Always show toolbar, for example purposes only.
DEBUG_TOOLBAR_CONFIG = {
'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
}
这在my URL.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
因此,django调试工具栏也使用JavaScript运行。您是否确认有n个冲突的JS脚本影响您的设置?我在一个使用DjDT的项目中度过了一段非常痛苦的时光,它是一个返回顶端的脚本,干扰了 另外,我知道你有很多额外的代码来处理你的代理情况,但是你有没有直接打开它,看看它在你的服务器上是否有效?我可能会创建一个新的virtualenv,从头开始,确保它在您的服务器上工作,然后继续添加应用程序和其他配置 这些可能是你们想到的,但我想我还是要加上它们,因为你们的问题并没有得到太多的行动
祝你好运。我使用的设置与OP描述的完全相同,但明显的例外是在单独的Docker容器中运行所有内容,这使得每个服务的IP很难预测 这就是强制Django调试工具栏始终显示的方式(仅在本地使用,绝不在生产中使用):
实际上,您不应该在生产服务器上将
DEBUG
设置为True
,保留它False
,然后检查下面的解决方案:
默认DDT回调(debug\u toolbar.middleware.show\u toolbar
)检查是debug
必须设置为True
,请求的IP必须位于内部\u IP
,并且请求不能是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
}
if 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
如果您愿意,也可以查看HTTP\u X\u FORWARDED\u查看,这取决于您自己
URL:
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
}
if 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
我不得不在projecturl.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)),
)
如果你是docker,下面的代码帮助我获得了内部ip 调试工具栏 如果调试: 导入操作系统 导入套接字 主机名,\ uIPS=socket.gethostbyname\ uEx(socket.gethostname()) 内部ip=[ip[:-1]+'1'表示ip中的ip]+['127.0.0.1','10.0.2.2',] 信用在这里
这个答案还有其他选项:今晚我发现,当我添加如上所示的禁用面板和显示模板上下文设置时,NoReverseMatch错误消失了,但DDT仍然没有出现在我的浏览器中。我想我看不到工具栏的原因是因为我在Nginx后面,Nginx是一个反向代理。工具栏只能通过在“内部IP设置”中设置的IP地址查看。我明天将对此进行检查。添加中间件以确保客户端地址从Nginx传递到DDT中间件并没有解决问题。我更新了上面的代码来展示这个新的中间件。1.7.4而不是1.6.2,我仍然得到这个错误!我完全不知道问题出在哪里!!正如Hans指出的,您可以覆盖DDT显示的时间-您不需要
DEBUG=True
。例如,在我的项目中,我发送一个特殊的HTTP头来触发工具栏。