Django runserver绑定到0.0.0.0,如何获取哪个IP发出了请求?

6
我正在一个拥有多个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/etchttp://10.0.0.2/app/path/etc
我知道如果我使用Apache,我可以使用Apache环境变量,例如SERVER_ADDR,但我没有使用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地址。
谢谢, Ben

为什么不将其绑定到特定的IP地址上呢?python manage.py runserver 10.0.0.1(2):5000 - Paulo Bu
我觉得@Ben想表达的是服务器如何检测到被请求的IP地址? - Games Brainiac
是的,@GamesBrainiac,那正是我想表达的意思 :) - Ben
我知道,但是为什么要费心呢,Django的服务器并不适用于生产环境。我只是在建议,无论如何这是一个非常合理的问题 :) - Paulo Bu
2个回答

5
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]就是你的地址。


抱歉,我应该表述得更清楚 - 我已经编辑了我的答案以包含更多信息。 - Ben
好的,我明白了。那我不知道该怎么做,不过我已经在我的答案中添加了一些建议。 - fsw

0

如果您的目标是确保负载均衡器正常工作,我认为这不是应用程序代码必须完成的绝对要求。您可以使用网络数据包分析器,在特定接口上进行监听(例如,tcpdump -i <interface>),然后查看输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接