الحل المستخدم في 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 نفسه ولكن أي مساعدة موضع تقدير وسأعتقد أنها مفيدة للآخرين.
هذا ما افعله:
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 المذكور! سأصوت عليه بالتأكيد: ابتسم:
لقد أضفته هنا :) https://stackoverflow.com/a/49818040/317346
يبدو أنه لا يوجد اهتمام إضافي بهذه المشكلة ، وقد حصلت على إجابتي: إغلاق: بشكل بسيط_ابتسامة_الوجه:
يستخدم أحد زملائي حلاً آخر لهذا: في الواقع يوفر شريط أدوات django-debug إعداد تكوين يسمى 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,
}
التعليق الأكثر فائدة
هذا ما افعله:
ببساطة قم بتعيين عنصر يحتوي على جميع الأشياء إلى
INTERNAL_IPS
. بالطبع لا تفعل هذا