【问题标题】:How do I get the client port number in a Django project?如何在 Django 项目中获取客户端端口号?
【发布时间】:2015-07-27 12:53:12
【问题描述】:

我正在使用django 构建我的网络服务器,其他人作为客户端连接到我。现在我需要知道客户端的端口号来区分它们。如果他们的浏览器打开同一个链接的两个“标签”,即两个页面但同一个链接,我也必须区分它们。

虽然我知道我可以使用 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。这对我来说可能很难配置,因此可能会导致其他更复杂的问题。这可能会使这个简单的问题变得复杂。

【问题讨论】:

  • 有一个类似的问题[这里][1][1]:stackoverflow.com/questions/20316078/…
  • 我看过这个话题,但解决方案可能不是最好的。所以我在这里更直接地提出这个问题。在谷歌群组中,我看到客户端使用与服务器相同的端口访问我的网站的荒谬答案......
  • 你试过sessions 吗?
  • 我对您的说法“我知道浏览器的每个 TAB 都会打开一个唯一的端口来访问我的 django 网页”感到有点困惑。您的 Django 应用程序只监听一个端口。会话机制不适合您区分用户的需求吗?
  • 在 HTTP 中,连接不是持久的。因此,这些端口在每个连接上都是不同的,因此您不能将它们作为 users 的标识符。

标签: python django port


【解决方案1】:

当我调试 django 时,我发现了这个

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

也许它可以工作

【讨论】:

  • 这可能在 Django(/python?) 版本之间有所不同:对我来说 request.environ["wsgi.input"].stream.raw._sock.getpeername() 工作
【解决方案2】:

是的,经过几天的挣扎,我回答了这个问题,并给出了一个关于“如何在 Django 中获取客户端端口”的有效但丑陋的解决方案

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

  2. 在你的项目中使用这个全局值。例如,其格式为 ('12.34.56.78',55437)。 55437 是端口号。

【讨论】:

  • 使其线程本地化将更好地与线程和微线程服务器一起使用。
【解决方案3】:
  1. 您关于“每个用户连接都在唯一端口打开连接”的假设是错误的。所有用户都使用同一个端口进行连接。
  2. 为了区分用户,Django(以及几乎所有其他框架)正在使用会话。每个用户都会获得一个带有其唯一会话 ID 的 cookie,并且此 cookie 在每次连接时都会传递给服务器,因此应用程序可以区分用户。

这里是关于会话的文档:

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

【讨论】:

  • OP 是正确的。每个连接都源自不同的端口。它导致到服务器上的相同 IP 和端口 - 但这不是所要求的。在打开几个浏览器选项卡的情况下在您的计算机上尝试 netstat。您是对的,尽管将其用作类似会话的密钥并不是一个好主意。
  • 您将服务器端口与浏览器正在侦听的端口混淆了。请参阅问题 OP 链接。也就是说,在这里使用会话并没有错。
  • 您能否在主题中添加更多关于您将要实现的内容的全局描述?也许我错了,但现在看来您正在尝试使用错误的工具来解决已经解决的问题。
  • 更具体地说,我希望您回答这个问题:您需要客户端端口号做什么?
  • 看,有一些方法可以区分用户工作流的不同“线程”。例如,您可以为页面上的所有链接添加一些唯一的 GET 参数,因此当用户单击链接时 - 您可以区分来自不同选项卡的单击。这个解决方案在所有情况下都是 100%。但是这样的解决方案是丑陋的,我怀疑你是否会找到更好的东西。因为在网络应用程序中,我们通常不区分不同选项卡的连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2015-08-04
相关资源
最近更新 更多