/ / django_debug_toolbar और Docker - django, docker, django-deb-toolbar

django_debug_toolbar और डॉकर - django, docker, django-debug-toolbar

इसलिए मुझे स्थानीय स्तर पर पहले काम करने के लिए डॉकटर और Django मिलाDockerfile से एक छवि का निर्माण करके, फिर छवि को पोस्टग्रेज करने के लिए अंजीर का उपयोग करके, इसे आधार छवि से लिंक करें, और स्थानीय पर्यवेक्षक को चलाएं। सब कुछ ठीक काम करता है, सिवाय django_debug_toolbar के। किसी कारण के लिए यह सिर्फ "टी शो अप जीता है। dockerhost आईपी के साथ ही आंतरिक_लिप्स में है। किसी को भी इसके साथ मेरी मदद कर सकते हैं? Docker बूट 2docker के माध्यम से मैक पर चल रहा है।

धन्यवाद!

मेरी सेटिंग्स:

इस में.py

import os

if "DEBUG" not in os.environ or not os.environ["DEBUG"]:
from .local import *
else:
pass

base.py

""" common and global settings """

from sys import path
from os import environ
from os.path import abspath, basename, dirname, join, normpath
from django.core.exceptions import ImproperlyConfigured
import dj_database_url


def get_env_variable(var_name):
try:
return environ[var_name]
except KeyError:
error_msg = "Set the environment variable" % var_name
raise ImproperlyConfigured(error_msg)

# Paths
DJANGO_ROOT = dirname(dirname(abspath(__file__)))
SITE_ROOT = dirname(DJANGO_ROOT)
SITE_NAME = basename(DJANGO_ROOT)
# End Paths


# URLs
MEDIA_ROOT = normpath(join(SITE_ROOT, "media"))
MEDIA_URL = "/media/"

STATIC_ROOT = normpath(join(SITE_ROOT, "assets"))
STATIC_URL = "/static/"

STATICFILES_DIRS = (
normpath(join(SITE_ROOT, "static")),
)

STATICFILES_FINDERS = (
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
)

ROOT_URLCONF = "%s.urls" % SITE_NAME

path.insert(0, join(DJANGO_ROOT, "apps"))  # add apps folder to system path
# End URLs


# Database
# example:  postgres://joris:luna@localhost/bitbybit
DATABASES = {"default": dj_database_url.config(
default="postgres://postgres@db:5432/postgres")}
# End Database

# Templates
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request",
)

TEMPLATE_LOADERS = (
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
)

TEMPLATE_DIRS = (
normpath(join(SITE_ROOT, "templates")),
)
# End Templates


# SECURITY WARNING: keep the secret key used in production secret!
# make it unique and store it as an environment variable
SECRET_KEY = r"d%g7_h6cz=xbhs*5-i+e$c7mns*s)^_+#^8n@^-2dno@uie-z9"


# Application
DJANGO_APPS = (
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
)

LOCAL_APPS = (
"home",
)

INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS

MIDDLEWARE_CLASSES = (
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.SessionAuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"debug_toolbar.middleware.DebugToolbarMiddleware",
)

WSGI_APPLICATION = "%s.wsgi.application" % SITE_NAME
# End Application


# Internationalization
LANGAUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_L10N = True

USE_TZ = True
# End Internationalization

Local.py

from .base import *

# Debug config
DEBUG = True
TEMPLATE_DEBUG = DEBUG
# End Debug config

# Hosts
ALLOWED_HOSTS = ["127.0.0.1", "localhost"]
# End Hosts


# Django Debug Toolbar config
INSTALLED_APPS += (
"debug_toolbar", )

INTERNAL_IPS = ("127.0.0.1", "localhost")
# End Django Debug Toolbar config

उत्तर:

जवाब के लिए 9 № 1

IP पता जिसने मुझे django टूलबार प्रदर्शित करने की अनुमति दी, मेरे docker कंटेनर से जुड़े गेटवे का IP था। गैटवे का आईपी प्राप्त करने के लिए मैं इस कॉमैंड को चलाता हूं

docker inspect my_container_name | grep -e ""Gateway""
# "Gateway": "172.18.0.1",

कुल मिलाकर मेरी सेटिंग इस तरह दिखती है

INSTALLED_APPS = (
"debug_toolbar",
)
INTERNAL_IPS = ["172.18.0.1"]

जवाब के लिए 8 № 2

यदि आप इस प्रोग्राम को करना चाहते हैं और अपने कंटेनर को कॉपी / पेस्ट नहीं करना चाहते हैं, तो मैं आपको सुझाव देता हूं कि आप इसे पसंद करें Django-cookiecutter मित्रों। आपकी स्थानीय सेटिंग फ़ाइल में:

INTERNAL_IPS = ["127.0.0.1", ]
import socket
import os
# tricks to have debug toolbar when developing with docker
ip = socket.gethostbyname(socket.gethostname())
INTERNAL_IPS += [ip[:-1] + "1"]

संदर्भ के लिए, यह लिंक है django-cookiecutter local.py सेटिंग्स फ़ाइल।


जवाब के लिए 4 № 3

आप बस बना सकते हैं INTERNAL_IPS एक वस्तु जिसमें सब कुछ शामिल है। मैं यह करता हूं:

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

बेशक आपको करना चाहिए कभी नहीँ एक उत्पादन मेजबान पर यह करो!

स्पष्टीकरण:

प्रकार फ़ंक्शन (तीन तर्क संस्करण: https://docs.python.org/3/library/functions.html#type) एक नया वर्ग बनाता है जो इस मामले में केवल ए __contains__ तरीका (https://docs.python.org/3/reference/datamodel.html#objectशामिल) - इसमें सदस्यता परीक्षणों को लागू करने के लिए उपयोग किया जाता है, जिसका अर्थ है कि इस पद्धति को ईजी चलने पर कहा जाता है। "if ip in INTERNAL_IPS"। विधि में ही स्पष्ट होगा अगर लिखा हो तो"def __contains__(self):n return True"नई बनाई गई कक्षा को तुरंत (अंतिम") () "" और INTERNAL_IPS को सौंपा गया है


जवाब के लिए 2 № 4

हल किया। अनुरोध हेडर में REMOTE_ADDR के लिए मूल्य की जाँच की और कहा कि INTERNAL_IPS में।


जवाब के लिए 2 № 5

पर स्वीकृत उत्तर का उपयोग करना https://unix.stackexchange.com/questions/87468/is-there-an-easy-way-to-programmatically-extract-ip-address मैं मेजबान के डॉकर पुल के पते को पास करके काम पाने में सक्षम था docker run एक पर्यावरण चर के रूप में कमान:

-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po "inet K[d.]+")"

उस सेट के साथ, निम्नलिखित दो पंक्तियाँ settings.py इसका पता लगाया और मेजबान को टूलबार देखने की अनुमति दी:

if "DOCKER_HOST" in os.environ:
INTERNAL_IPS = [os.environ["DOCKER_HOST"]]

जवाब के लिए 2 № 6

कॉन्फ़िगरेशन का उपयोग करके मेरे लिए SHOW_TOOLBAR_CALLBACK का उपयोग किया गया

def show_toolbar(request):
return True

DEBUG_TOOLBAR_CONFIG = {
"SHOW_TOOLBAR_CALLBACK": show_toolbar,
}

मुझे उम्मीद है कि मदद की :)


उत्तर के लिए 1 № 7

यहाँ एक हैकी तरीका है कि टी इंजेक्शन लगाने की आवश्यकता नहीं हैकंटेनर में पता। मुझे यकीन नहीं है कि यह कैसे काम करेगा यदि आपका कंटेनर कई नेटवर्कों से जुड़ा हुआ है और टूट सकता है यदि डॉकटर ने पते को असाइन करने के तरीके को बदल दिया (हालांकि यह संभव नहीं है)।

import subprocess

route = subprocess.Popen(("ip", "route"), stdout=subprocess.PIPE)
network = subprocess.check_output(
("grep", "-Po", "src K[d.]+."), stdin=route.stdout).decode().rstrip()
route.wait()
network_gateway = network + "1"
INTERNAL_IPS = [network_gateway]