【问题标题】:Django runserver bound to 0.0.0.0, how can I get which IP took the request?Django runserver 绑定到 0.0.0.0,我怎样才能得到哪个 IP 接受了请求?
【发布时间】:2013-07-11 13:44:28
【问题描述】:

我正在一个有很多 IP 地址的主机上运行一个临时的 Django 应用程序。在使用manage.py runserver 0.0.0.0:5000 时,代码如何查看机器的众多 IP 地址中的哪一个是请求实际命中的地址,如果这可能的话?

或者换一种说法:

我的主机的 IP 地址为 10.0.0.110.0.0.2。当runserver 监听0.0.0.0 时,我的应用程序如何知道用户点击的是http://10.0.0.1/app/path/etc 还是http://10.0.0.2/app/path/etc

我知道,如果我使用 Apache 执行此操作,我可以使用像 SERVER_ADDR 这样的 Apache 环境变量,但我没有使用 Apache。

有什么想法吗?

编辑

更多信息:

我正在使用一个小型 Django 应用程序测试负载均衡器。此应用正在侦听多个不同的 IP,我需要知道哪个 IP 地址针对来自负载平衡器的请求而命中,以便确保它正确平衡。

我不能使用request.get_host()request.META 选项,因为它们会返回用户键入的内容以达到负载平衡器。

例如:用户点击http://10.10.10.10/foo,这会将请求转发到http://10.0.0.1/foohttp://10.0.0.2/foo - 但request.get_host() 将返回10.10.10.10,而不是服务器正在侦听的实际IP。

谢谢, 本

【问题讨论】:

  • 为什么不直接绑定到特定的ip呢? python manage.py runserver 10.0.0.1(2):5000
  • 我认为@Ben 想说的是服务器如何检测请求命中的IP?
  • 是的@GamesBrainiac,这正是我的意思:)
  • 我知道,但是,为什么要麻烦,django 的服务器不打算用于生产。我只是建议,无论如何这是一个非常有效的问题:)

标签: python django manage.py


【解决方案1】:
request.get_host()

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

但请注意,这可能会被欺骗,因此请不要在其上传递您的安全信息。

如果用户在同一地址下看到您的机器,我不确定这是否可以通过 runserver(它应该是简单的开发工具)实现。

也许你可以使用 nginx? 或者,如果这仅用于测试,请执行以下操作:

for i in 1 2 3 4 5; do manage.py runserver 10.0.0.$i:5000; done

然后 sys.args[2] 就是你的地址

【讨论】:

  • 对不起,我应该更清楚 - 我已经编辑了我的答案以包含更多信息。
  • 好的,我明白了,我不知道该怎么做,在我的回答中添加了一些建议
【解决方案2】:

如果您的目标是确保负载均衡器正常工作,我想在应用程序代码中执行此操作并不是绝对要求。您可以使用可以侦听特定接口(例如,tcpdump -i <interface>)的网络数据包分析器并查看输出。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2017-12-18
    • 2011-07-16
    • 2012-10-02
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多