Как заставить django-debug-toolbar отображаться только на моем IP-адресе, размещенном на python в любом месте?

Я пытаюсь использовать django-debug-toolbar на python в любом месте приложения django. Это требует, чтобы я установил свой IP-адрес в настройках, которые я сделал, но панель инструментов не отображается. После дальнейшего расследования я обнаружил, что панель инструментов django-debug-toolbar ищет атрибут REMOTE_ADDR. Проблема в том, что атрибут REMOTE_ADDR не является моим обычным IP-адресом. Похоже, что они используют балансировку нагрузки или что-то в этом роде, поэтому на самом деле он не дает IP-адрес, с которого исходит запрос.

Если я использую IP-адрес из REMOTE_ADDR, панель инструментов отображается, но она отображается для КАЖДОГО пользователя, который заходит на сайт, а не только для меня.

Как я могу получить IP-адрес клиента, делающего запрос?


person Jackobson    schedule 08.02.2017    source источник


Ответы (1)


Python везде устанавливает пользовательское определение в заголовках, называемых

HTTP_X_REAL_IP

Это IP-адрес, с которого pythonanywhere получает запрос, и он лучше всего подходит для получения фактического IP-адреса клиента.

Вы также можете использовать HTTP_X_FORWARDED_FOR, но теоретически он может содержать набор разных IP-адресов, если входящий запрос проходит через какой-то прокси-сервер до попадания в pythonAnywhere.

Для этого есть два варианта.

во-первых, вы можете добавить это в свой settings.py

def custom_show_toolbar(request.META.get('HTTP_X_REAL_IP', None) in INTERNAL_IPS):
    return True 
# Show toolbar, if the IP returned from HTTP_X_REAL_IP IS listed as INTERNAL_IPS in settings
    if request.is_ajax():
        return False
# Show toolbar, if the request is not ajax
    return bool(settings.DEBUG)
# show toolbar if debug is true

DEBUG_TOOLBAR_CONFIG = {
    'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
}

Или вы можете изменить файл middleware.py внутри папки django-debug-toolbar и изменить следующий код:

def show_toolbar(request):
    """
    Default function to determine whether to show the toolbar on a given page.
    """
    if request.META.get('REMOTE_ADDR', None) not in settings.INTERNAL_IPS:
        return False

    if request.is_ajax():
        return False

    return bool(settings.DEBUG)

To:

def show_toolbar(request):
    """
    Default function to determine whether to show the toolbar on a given page.
    """
    if request.META.get('HTTP_X_REAL_IP', None) not in settings.INTERNAL_IPS:
        return False

    if request.is_ajax():
        return False

    return bool(settings.DEBUG)
person Tim Baker    schedule 08.02.2017
comment
Спасибо, HTTP_X_REAL_IP был тем, что мне было нужно! Это набор на каждом сервере или только питон где угодно? - person Jackobson; 08.02.2017
comment
Разработчик PythonAnywhere здесь: нет официального стандарта, для которого сервер за балансировщиком нагрузки должен использовать заголовок, но X-Real-IP является наиболее распространенным. - person Giles Thomas; 09.02.2017