如何让django-debug-toolbar只在我在任何地方托管的ip地址上显示?

时间:2017-02-08 04:52:11

标签: python django pythonanywhere django-debug-toolbar

我正在尝试在django app中的任何地方使用django-debug-toolbar。它需要我在我完成的设置中设置我的IP地址,但工具栏没有显示。经过进一步调查,我发现django-debug-toolbar正在寻找REMOTE_ADDR属性。问题是REMOTE_ADDR属性不正常我的IP地址。看起来他们正在使用负载平衡或其他东西,因此它实际上并没有给出请求来自的IP。

如果我使用REMOTE_ADDR的IP地址显示工具栏,但它会显示每个访问该网站的用户,而不仅仅是我。

如何获取发出请求的客户端的IP地址?

1 个答案:

答案 0 :(得分:4)

Python Anywhere在名为

的标题中设置自定义定义

HTTP_X_REAL_IP

这是pythonanywhere从中接收请求的IP地址,这似乎最适合获取实际的客户端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,
}

或者您可以修改django-debug-toolbar文件夹中的文件middleware.py,并更改以下代码:

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)

要:

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)