django_debug_toolbar和Docker

Jor*_*ris 15 django django-debug-toolbar docker

所以我让docker和Django在本地工作,首先从Dockerfile构建图像,然后使用Fig获取postgres图像,将其链接到基本图像,然后运行localserver.除了django_debug_toolbar之外,一切正常.由于某种原因,它不会出现.在internal_ips中也有dockerhost ip.任何人都可以帮我解决这个问题吗?Docker通过boot2docker在mac上运行.

谢谢!

我的设置:

init .py

import os

if 'DEBUG' not in os.environ or not os.environ['DEBUG']:
    from .local import *
else:
    pass
Run Code Online (Sandbox Code Playgroud)

base.py

""" common and global settings """

from sys import path
from os import environ
from os.path import abspath, basename, dirname, join, normpath
from django.core.exceptions import ImproperlyConfigured
import dj_database_url


def get_env_variable(var_name):
    try:
        return environ[var_name]
    except KeyError:
        error_msg = "Set the environment variable" % var_name
        raise ImproperlyConfigured(error_msg)

# Paths
DJANGO_ROOT = dirname(dirname(abspath(__file__)))
SITE_ROOT = dirname(DJANGO_ROOT)
SITE_NAME = basename(DJANGO_ROOT)
# End Paths


# URLs
MEDIA_ROOT = normpath(join(SITE_ROOT, 'media'))
MEDIA_URL = "/media/"

STATIC_ROOT = normpath(join(SITE_ROOT, 'assets'))
STATIC_URL = "/static/"

STATICFILES_DIRS = (
    normpath(join(SITE_ROOT, 'static')),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

ROOT_URLCONF = '%s.urls' % SITE_NAME

path.insert(0, join(DJANGO_ROOT, 'apps'))  # add apps folder to system path
# End URLs


# Database
# example:  postgres://joris:luna@localhost/bitbybit
DATABASES = {'default': dj_database_url.config(
   default='postgres://postgres@db:5432/postgres')}
# End Database

# Templates
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.request',
)

TEMPLATE_LOADERS = (
   'django.template.loaders.filesystem.Loader',
   'django.template.loaders.app_directories.Loader',
)

TEMPLATE_DIRS = (
    normpath(join(SITE_ROOT, 'templates')),
)
# End Templates


# SECURITY WARNING: keep the secret key used in production secret!
# make it unique and store it as an environment variable
SECRET_KEY = r"d%g7_h6cz=xbhs*5-i+e$c7mns*s)^_+#^8n@^-2dno@uie-z9"


# Application
DJANGO_APPS = (
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
)

LOCAL_APPS = (
   'home',
)

INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
)

WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME
# End Application


# Internationalization
LANGAUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True
# End Internationalization
Run Code Online (Sandbox Code Playgroud)

Local.py

from .base import *

# Debug config
DEBUG = True
TEMPLATE_DEBUG = DEBUG
# End Debug config

# Hosts
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
# End Hosts


# Django Debug Toolbar config
INSTALLED_APPS += (
    'debug_toolbar', )

INTERNAL_IPS = ('127.0.0.1', 'localhost')
# End Django Debug Toolbar config
Run Code Online (Sandbox Code Playgroud)

小智 21

使用配置SHOW_TOOLBAR_​​CALLBACK为我唤醒

def show_toolbar(request):
        return True

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': show_toolbar,
}
Run Code Online (Sandbox Code Playgroud)

我希望有帮助:)

  • 这应该是公认的答案,因为它使用了django-debug-toolbar提供的官方API :)我用lambda简化它:`'SHOW_TOOLBAR_​​CALLBACK':lambda request:如果DEBUG,则为真,否则为False,`.谢谢! (5认同)
  • 它甚至可以只是`'SHOW_TOOLBAR_​​CALLBACK':lambda请求:DEBUG` :) (3认同)

Mat*_*olz 15

你可以创建INTERNAL_IPS一个包含所有内容的对象.这就是我做的:

if DEBUG:
    # `debug` is only True in templates if the vistor IP is in INTERNAL_IPS.
    INTERNAL_IPS = type(str('c'), (), {'__contains__': lambda *a: True})()
Run Code Online (Sandbox Code Playgroud)

当然,你永远不应该在生产主机上这样做!

说明:

类型函数(三个参数变量:https://docs.python.org/3/library/functions.html#type)创建一个新类,在这种情况下只有一个__contains__方法(https://docs.python.org /3/reference/datamodel.html#object.包含) - contains用于实现成员资格测试,这意味着在运行例如" if ip in INTERNAL_IPS" 时调用此方法.如果写为" def __contains__(self):\n return True",则contains方法本身可能会更清晰.新创建的类立即被实例化(最后的"()")并分配给INTERNAL_IPS

  • 这是一个始终有效的聪明解决方案,使用命令行,子进程,网络,请求,环境变量,地狱甚至IP都不会造成任何怪异的破解!谢谢 :) (2认同)

Jor*_*rdi 10

如果您想以编程方式执行此操作而不是复制/粘贴容器IP,我建议您喜欢django-cookiecutter人员.在您的本地设置文件中:

INTERNAL_IPS = ['127.0.0.1', ]
import socket

# tricks to have debug toolbar when developing with docker
ip = socket.gethostbyname(socket.gethostname())
INTERNAL_IPS += [ip[:-1] + '1']
Run Code Online (Sandbox Code Playgroud)

作为参考,这是django-cookiecutter local.py设置文件的链接.

  • 这个解决方案对我不起作用:返回的 `ip` 并不总是相同的。它似乎是 Django 容器连接到的网络之一的 IP。所以有时它有效,但大多数时候它不起作用。 (2认同)
  • 请注意,django-cookiecutter 设置文件现在的做法与此处显示的示例略有不同,因此值得查看其当前版本(适用于我)。 (2认同)

Luk*_*ski 9

允许我显示Django调试工具栏的IP地址是与我的docker容器关联的网关的IP.要获取网关的IP,请运行此命令

docker inspect my_container_name | grep -e '"Gateway"'
# "Gateway": "172.18.0.1",
Run Code Online (Sandbox Code Playgroud)

总的来说,我的设置看起来像这样

INSTALLED_APPS = (
    'debug_toolbar',
)
INTERNAL_IPS = ['172.18.0.1']
Run Code Online (Sandbox Code Playgroud)


Jor*_*ris 3

解决了。检查请求标头中 REMOTE_ADDR 的值并将其添加到 INTERNAL_IPS。