如何在Django项目中获取客户端端口号?

时间:2015-05-15 14:34:20

标签: python django port

我使用django构建我的Web服务器,其他人以客户端身份连接到我。现在我需要了解客户'端口号来区分它们。如果他们的浏览器打开两个标签'相同的链接,即两个页面,但相同的链接,我也必须区分它们。

虽然我知道我可以使用 request.META [' REMOTE_ADDR'] 来获取我的django视图功能中的客户端IP,但这真的不够对我来说。

然后我研究了一些TCP / IP基础知识,然后我知道在TCP / IP层,每个IP数据包都有一个IP头,其中包含客户端的端口号。但是如何在django中访问它?

其他信息:

  • 我使用的是python 2.6和django 1.4
  • 我知道浏览器的每个TAB都会被分配一个随机的唯一端口来访问我的django网页端口。 - 请参阅此链接' The web server opens port 80, but the browser has a different, randomly-assigned port.'我真的需要区分它们。所以我直观的想法是使用IP数据包中的端口号。如果您有任何其他建议,也欢迎。
  • 我找到the similar question here,但我现在不使用Apache。这对我来说可能很难配置,所以可能导致其他更复杂的问题。这可能会使这个简单的问题变得复杂。

3 个答案:

答案 0 :(得分:1)

  1. 您对“每个用户连接在唯一端口打开连接”的假设是错误的。所有用户都使用相同的端口进行连接。
  2. 区分用户Django(以及几乎所有其他框架)正在使用会话。每个用户都使用其唯一的会话ID获取cookie,并且此cookie在每个连接上传递给服务器,因此应用程序可以区分用户。
  3. 以下是会话文档:

    https://docs.djangoproject.com/en/1.8/topics/http/sessions/

答案 1 :(得分:0)

是的,经过几天的挣扎之后,我回答一下,在“如何在Django中获取客户端端口”中使用了一个有效但又难看的解决方案

    你的python26 / Lib / SocketServer.py中的
  1. ,找到def process_request_thread,添加 global gClientPort; gClientPort = client_address

  2. 在yout项目中使用此全局值。例如,它的格式是('12 .34.56.78',55437)。 55437是端口号。

答案 2 :(得分:0)

在调试django时,我发现了

request.environ["wsgi.input"].raw._sock.getpeername()

也许可以正常工作