Django runserver绑定到0.0.0.0,我怎么能得到哪个IP接受了请求?

时间:2013-07-11 13:44:28

标签: python django manage.py

我在拥有大量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。

谢谢, 本

2 个答案:

答案 0 :(得分: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]是你的地址

答案 1 :(得分:0)

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