如何获取 Django 项目中的客户端端口号?
How do I get the client port number in a Django project?
我正在使用 django 构建我的网络服务器,其他人作为客户端连接到我。现在我需要知道客户端的端口号来区分它们。如果他们的浏览器打开两个'Tabs'相同的link,即两个页面但相同link,我也必须区分它们。
虽然我知道我可以在我的django视图函数中使用request.META['REMOTE_ADDR']来获取客户端的IP,但这还不够对我来说。
然后我研究了一些TCP/IP基础知识,然后我知道在TCP/IP层,每个IP数据包都有一个IP头,其中包含客户端的端口号。但是我怎样才能在 django 中访问它呢?
附加信息:
- 我正在使用 python 2.6 和 django 1.4
- 我知道浏览器的每个 TAB 都会被分配一个随机的唯一端口来访问我的 django 网页端口。 -- 看到这个 link 'The web server opens port 80, but the browser has a different, randomly-assigned port.' 我真的需要区分它们。所以我的直觉是利用IP包中的端口号。如果您还有其他建议,也欢迎提出。
- 我找到了 the similar question here,但我现在没有使用 Apache。这对我来说可能很难配置,所以可能会导致其他更复杂的问题。这可能会使这个简单的问题变得复杂。
- 您关于 'every user connection opens connection at unique port' 的假设是错误的。所有用户都使用相同的端口进行连接。
- 为了区分用户,Django(以及几乎所有其他框架)正在使用会话。每个用户都会得到一个带有其唯一会话 ID 的 cookie,这个 cookie 会在每次连接时传递到服务器,因此应用程序可以区分用户。
这是关于会话的文档:
是的,经过几天的努力,我在 'how to get client port in Django'.
上用一个有效但丑陋的 解决方案 回答了这个问题
在你的python26/Lib/SocketServer.py中,找到def process_request_thread
,添加
global gClientPort; gClientPort = client_address
在您的项目中使用这个全局值。例如,它的格式是 ('12.34.56.78',55437)。 55437是端口号。
当我调试 django 时,我发现了这个
request.environ["wsgi.input"].raw._sock.getpeername()
也许可以
我正在使用 django 构建我的网络服务器,其他人作为客户端连接到我。现在我需要知道客户端的端口号来区分它们。如果他们的浏览器打开两个'Tabs'相同的link,即两个页面但相同link,我也必须区分它们。
虽然我知道我可以在我的django视图函数中使用request.META['REMOTE_ADDR']来获取客户端的IP,但这还不够对我来说。
然后我研究了一些TCP/IP基础知识,然后我知道在TCP/IP层,每个IP数据包都有一个IP头,其中包含客户端的端口号。但是我怎样才能在 django 中访问它呢?
附加信息:
- 我正在使用 python 2.6 和 django 1.4
- 我知道浏览器的每个 TAB 都会被分配一个随机的唯一端口来访问我的 django 网页端口。 -- 看到这个 link 'The web server opens port 80, but the browser has a different, randomly-assigned port.' 我真的需要区分它们。所以我的直觉是利用IP包中的端口号。如果您还有其他建议,也欢迎提出。
- 我找到了 the similar question here,但我现在没有使用 Apache。这对我来说可能很难配置,所以可能会导致其他更复杂的问题。这可能会使这个简单的问题变得复杂。
- 您关于 'every user connection opens connection at unique port' 的假设是错误的。所有用户都使用相同的端口进行连接。
- 为了区分用户,Django(以及几乎所有其他框架)正在使用会话。每个用户都会得到一个带有其唯一会话 ID 的 cookie,这个 cookie 会在每次连接时传递到服务器,因此应用程序可以区分用户。
这是关于会话的文档:
是的,经过几天的努力,我在 'how to get client port in Django'.
上用一个有效但丑陋的 解决方案 回答了这个问题在你的python26/Lib/SocketServer.py中,找到
def process_request_thread
,添加global gClientPort; gClientPort = client_address
在您的项目中使用这个全局值。例如,它的格式是 ('12.34.56.78',55437)。 55437是端口号。
当我调试 django 时,我发现了这个
request.environ["wsgi.input"].raw._sock.getpeername()
也许可以