我有一个小的Python代码来读取访问我的Flask网站的客户端的IP地址,托管在pythonanywhere.com上:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
ipread1 = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
print("The client IP1 is: %s" % (ipread1))
return 'Hello World!'
if __name__ == '__main__':
app.run()
每次刷新网页时,这都会在服务器日志中正确返回我的IPv4地址。但是,我希望它能提供我的IPv6地址(我已经检查过我的确有)。
为此,我尝试过更改:
app.run()
到app.run(host='::')
但这仍然只是提供我的IPv4地址。如何强制Python提供我的IPv6地址?
PythonAnywhere处理的所有请求都来自IPv4,因此您将看不到IPv6地址。
考虑app.run()
的第一个案例。你得到的是客户的IPV4地址,例如:
The client IP1 is: 127.0.0.1
现在,如果您添加参数host app.run(host='::')
,您将在IPv6套接字上侦听并获取类似的内容:
The client IP1 is: ::ffff:127.0.0.1
客户端是否使用IPv6?
不,客户端仍在使用其IPv4地址并与IPv4服务器通信。所以,从它的角度来看,没有任何差异。你得到的v4-mapped-on-v6 address
有以下形式的变化:
000 ... 000 | FFFF | IPv4 Address
80 bits 16 bits 32 bits
例如,参见相应的RFC。
以这种方式,从服务器的角度来看,它看起来像是来自IPv6主机,并且它将能够使用双栈IPv4 / IPv6。
如果您想要查看不同的内容,则必须更改客户端发送请求的方式。