Django-debug-toolbar: Неправильный IP при нескольких сетях в Docker

Созданный на 13 апр. 2018  ·  5Комментарии  ·  Источник: jazzband/django-debug-toolbar

Решение, используемое в cookiecutter-django , не работает, когда контейнер Django подключен к нескольким сетям в Docker. Решение выглядит примерно так (взято из этого сообщения SO ):

import socket

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

В моей конфигурации Docker Compose есть следующие элементы:

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


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

Теперь IP, возвращаемый ip = socket.gethostbyname(socket.gethostname()) , не всегда один и тот же. Кажется, это IP-адрес одной из разных доступных сетей (если это имеет смысл). Иногда это срабатывает, но в большинстве случаев - нет.

В итоге я добавил все возможные IP-адреса на основе одного, возвращенного socket , примерно так:

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']

Есть ли более чистый способ решения этой проблемы? У кого-нибудь из вас была такая же проблема? Возможно, это не связано с самой панелью инструментов Django Debug Toolbar, но любая помощь приветствуется, и я считаю, что она будет полезна для других.

Самый полезный комментарий

Вот что я делаю:

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

Просто назначьте объект, содержащий все, INTERNAL_IPS . Конечно, никогда не делайте этого на производственном хосте!

Все 5 Комментарий

Вот что я делаю:

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

Просто назначьте объект, содержащий все, INTERNAL_IPS . Конечно, никогда не делайте этого на производственном хосте!

Умный! Вам следует подумать о добавлении этого ответа в упомянутый пост SO! Я бы однозначно поддержал: smile:

Я добавил сюда :) https://stackoverflow.com/a/49818040/317346

Похоже, интереса к этому вопросу больше нет, и я получил ответ: закрытие: слегка_smiling_face:

Один из моих коллег использует для этого другое решение: на самом деле django-debug-toolbar предоставляет параметр конфигурации с именем 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,
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги