Django-debug-toolbar: IP salah saat banyak jaringan di Docker

Dibuat pada 13 Apr 2018  ·  5Komentar  ·  Sumber: jazzband/django-debug-toolbar

Solusi yang digunakan dalam cookiecutter-Django tidak bekerja ketika wadah Django terhubung ke banyak jaringan di Docker. Solusinya adalah seperti berikut (diambil dari posting SO ini):

import socket

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

Konfigurasi Docker Compose saya memiliki item berikut:

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


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

Sekarang IP yang dikembalikan oleh ip = socket.gethostbyname(socket.gethostname()) tidak selalu sama. Tampaknya itu adalah IP dari salah satu jaringan berbeda yang tersedia (jika itu masuk akal). Jadi kadang-kadang berhasil, tetapi sebagian besar waktu tidak.

Saya akhirnya menambahkan semua IP yang mungkin berdasarkan yang dikembalikan oleh socket , seperti:

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

Apakah ada solusi yang lebih bersih untuk ini? Apakah ada di antara Anda yang memiliki masalah yang sama? Ini mungkin tidak terkait dengan Django Debug Toolbar itu sendiri tetapi bantuan apa pun dihargai dan saya yakin akan berguna bagi orang lain.

Komentar yang paling membantu

Inilah yang saya lakukan:

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

Cukup tetapkan objek yang berisi semua hal ke INTERNAL_IPS . Tentu saja jangan pernah melakukan ini pada host produksi!

Semua 5 komentar

Inilah yang saya lakukan:

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

Cukup tetapkan objek yang berisi semua hal ke INTERNAL_IPS . Tentu saja jangan pernah melakukan ini pada host produksi!

Cerdik! Anda harus mempertimbangkan untuk menambahkan jawaban ini ke pos SO yang disebutkan! Saya pasti akan mendukungnya :senyum:

Saya telah menambahkannya di sini :) https://stackoverflow.com/a/49818040/317346

Sepertinya tidak ada minat lebih lanjut dalam masalah ini, dan saya mendapatkan jawaban saya: menutup :slightly_smiling_face:

Salah satu rekan saya menggunakan solusi lain untuk ini: sebenarnya Django-debug-toolbar menyediakan pengaturan konfigurasi yang disebut 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,
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat