Django-debug-toolbar: IP incorrecta cuando hay varias redes en Docker

Creado en 13 abr. 2018  ·  5Comentarios  ·  Fuente: jazzband/django-debug-toolbar

La solución utilizada en cookiecutter-django no funciona cuando el contenedor Django está conectado a múltiples redes en Docker. La solución es algo como lo siguiente (tomado de esta publicación SO ):

import socket

ip = socket.gethostbyname(socket.gethostname())
INTERNAL_IPS = ['127.0.0.1', ip[:-1] + '1']

Mi configuración de Docker Compose tiene los siguientes elementos:

networks:
  web_network: {}
  cache_network: {}
  database_network: {}


services:
  djangoapp:
    networks:
      - database_network
      - web_network
      - cache_network

Ahora, la IP devuelta por ip = socket.gethostbyname(socket.gethostname()) no siempre es la misma. Parece ser la IP de una de las diferentes redes disponibles (si eso tiene sentido). Entonces, a veces funciona, pero la mayoría de las veces no.

Terminé agregando todas las IP posibles basadas en la devuelta por socket , algo como:

def internal_docker_ips(base_ip):
    numbers = base_ip.split('.')
    return [
        '.'.join([numbers[0], str(i), numbers[2], str(j)])
        for i in range(1, 254) for j in (1, 3)  # all IPs ending with '.1' and '.3'
    ]

INTERNAL_IPS = [
    '127.0.0.1',
]

INTERNAL_IPS.extend(
    internal_docker_ips(
        socket.gethostbyname(
            socket.gethostname())))

# ['127.0.0.1', '172.1.0.1', '172.1.0.3', '172.2.0.1', '172.2.0.3', ..., '172.253.0.1', '172.253.0.3']

¿Existe una solución más limpia para esto? ¿Alguno de ustedes tuvo el mismo problema? Puede que no esté relacionado con la barra de herramientas de depuración de Django, pero se agradece cualquier ayuda y creo que será útil para otros.

Comentario más útil

Esto es lo que hago:

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})()

Simplemente asigne un objeto que contenga todas las cosas a INTERNAL_IPS . ¡Por supuesto, nunca hagas esto en un host de producción!

Todos 5 comentarios

Esto es lo que hago:

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})()

Simplemente asigne un objeto que contenga todas las cosas a INTERNAL_IPS . ¡Por supuesto, nunca hagas esto en un host de producción!

¡Inteligente! ¡Debería considerar agregar esta respuesta a la publicación SO mencionada! Definitivamente lo votaría a favor: sonrisa:

Parece que no hay más interés en este problema, y ​​obtuve mi respuesta: cierre: cara_smiling_ligeramente:

Uno de mis colegas usa otra solución para esto: en realidad, django-debug-toolbar proporciona una opción de configuración llamada SHOW_TOOLBAR_CALLBACK .

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda request: True,
}

# or

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': lambda request: True if DEBUG else False,
}
¿Fue útil esta página
0 / 5 - 0 calificaciones