Django-debug-toolbar: IP errado quando várias redes no Docker

Criado em 13 abr. 2018  ·  5Comentários  ·  Fonte: jazzband/django-debug-toolbar

A solução usada em cookiecutter-django não funciona quando o contêiner Django está conectado a várias redes no Docker. A solução é algo como o seguinte (tirado desta postagem do SO ):

import socket

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

Minha configuração do Docker Compose tem os seguintes itens:

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


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

Agora, o IP retornado por ip = socket.gethostbyname(socket.gethostname()) não é sempre o mesmo. Parece ser o IP de uma das diferentes redes disponíveis (se isso fizer sentido). Às vezes funciona, mas na maioria das vezes não.

Acabei adicionando todos os IPs possíveis com base no retornado 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 uma solução mais limpa para isso? Algum de vocês teve o mesmo problema? Pode não estar relacionado ao Django Debug Toolbar em si, mas qualquer ajuda é apreciada e acredito que será útil para outros.

Comentários muito úteis

Isto é o que eu faço:

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

Simplesmente atribua um objeto que contém todas as coisas a INTERNAL_IPS . É claro que nunca faça isso em um host de produção!

Todos 5 comentários

Isto é o que eu faço:

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

Simplesmente atribua um objeto que contém todas as coisas a INTERNAL_IPS . É claro que nunca faça isso em um host de produção!

Esperto! Você deve considerar adicionar esta resposta à postagem SO mencionada! Eu definitivamente votaria positivamente: smile:

Parece que não há mais interesse neste assunto, e obtive minha resposta: encerrando: ligeiramente_sorriso_face:

Um de meus colegas usa outra solução para isso: na verdade, django-debug-toolbar fornece uma definição de configuração chamada 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,
}
Esta página foi útil?
0 / 5 - 0 avaliações