代码之家  ›  专栏  ›  技术社区  ›  Shadi Naif

使用django ipware获取客户机IP而不是真正的IP

  •  0
  • Shadi Naif  · 技术社区  · 7 年前

    在django ipware 2.1版中;旧 get_real_ip 函数已弃用。当我使用新的 get_client_ip ;我的测试单元没有显示相同的结果。这意味着这两个函数的行为不相同。

    以下是Django IPware测试单元(非矿山)的原始测试

    def test_http_x_forwarded_for_multiple(self):
        request = HttpRequest()
        request.META = {
            'HTTP_X_FORWARDED_FOR': '192.168.255.182, 10.0.0.0, 127.0.0.1, 198.84.193.157, 177.139.233.139',
            'HTTP_X_REAL_IP': '177.139.233.132',
            'REMOTE_ADDR': '177.139.233.133',
        }
        ip = get_real_ip(request)
        self.assertEqual(ip, "198.84.193.157")
    

    当然,上面的方法很好,但是我想确保使用新的 GETX-clitTypip 将得到相同的结果(用于系统升级)。但是,测试实际上没有通过这一断言:

    def test_http_x_forwarded_for_multiple(self):
        request = HttpRequest()
        request.META = {
            'HTTP_X_FORWARDED_FOR': '192.168.255.182, 10.0.0.0, 127.0.0.1, 198.84.193.157, 177.139.233.139',
            'HTTP_X_REAL_IP': '177.139.233.132',
            'REMOTE_ADDR': '177.139.233.133',
        }
        ip, is_routable = get_client_ip(request)
        self.assertEqual(ip, "198.84.193.157")
    

    结果:

    断言者错误:“177.139.233.132”!='198.84.193.157'

    在深入研究代码之后,我发现 GETX-clitTypip 不是在类元中迭代 GET-RealRealip . 它检查最左边的IP(或最右边的IP,取决于设置),如果 公共IP 找不到

    我现在的问题是: 我怎么称呼 GETX-clitTypip 以返回 GET-RealRealip ?改变函数行为背后的逻辑是什么?我应该相信新的 GETX-clitTypip 忘记 GET-RealRealip 或继续使用已弃用的 GET-RealRealip 忘记新的 GETX-clitTypip ???????

    1 回复  |  直到 7 年前
        1
  •  0
  •   Shadi Naif    7 年前

    我们应该忘记过去 get_real_ip 函数及其行为。见作者回复: https://github.com/un33k/django-ipware/issues/45#issuecomment-421572304

    推荐文章