Django-debug-toolbar: Falsche IP bei mehreren Netzwerken in Docker

Erstellt am 13. Apr. 2018  ·  5Kommentare  ·  Quelle: jazzband/django-debug-toolbar

Die in cookiecutter-django verwendete Lösung funktioniert nicht, wenn der Django-Container in Docker mit mehreren Netzwerken verbunden ist. Die Lösung ist etwa die folgende (aus diesem SO-Post ):

import socket

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

Meine Docker Compose-Konfiguration enthält die folgenden Elemente:

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


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

Nun ist die von ip = socket.gethostbyname(socket.gethostname()) IP nicht immer gleich. Es scheint die IP eines der verschiedenen verfügbaren Netzwerke zu sein (wenn das Sinn macht). Also manchmal funktioniert es, aber meistens nicht.

Am Ende habe ich alle möglichen IPs basierend auf der von socket hinzugefügt, etwa wie:

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

Gibt es dafür einen saubereren Workaround? Hatte jemand von euch das gleiche Problem? Es hat möglicherweise nichts mit der Django Debug Toolbar selbst zu tun, aber jede Hilfe wird geschätzt und wird meiner Meinung nach für andere nützlich sein.

Hilfreichster Kommentar

Das ist was ich mache:

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

Weisen Sie einfach INTERNAL_IPS ein Objekt zu, das alle Dinge enthält. Natürlich niemals auf einem Produktionshost!

Alle 5 Kommentare

Das ist was ich mache:

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

Weisen Sie einfach INTERNAL_IPS ein Objekt zu, das alle Dinge enthält. Natürlich niemals auf einem Produktionshost!

Klug! Sie sollten erwägen, diese Antwort dem erwähnten SO-Post hinzuzufügen! Ich würde es auf jeden Fall positiv bewerten :smile:

Ich habe es hier hinzugefügt :) https://stackoverflow.com/a/49818040/317346

Anscheinend besteht kein weiteres Interesse an diesem Problem, und ich habe meine Antwort erhalten: close :slightly_smiling_face:

Einer meiner Kollegen verwendet dafür eine andere Lösung: Tatsächlich bietet django-debug-toolbar eine Konfigurationseinstellung namens 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,
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen