【发布时间】:2011-04-15 04:05:11
【问题描述】:
我正在创建一个用户可以登录和下载文件的网站,使用 Flask micro-framework(基于 Werkzeug),它使用 Python(在我的例子中是 2.6)。
我需要在用户登录时获取他们的 IP 地址(用于记录目的)。 有谁知道如何做到这一点?当然有办法用 Python 做到这一点?
【问题讨论】:
标签: python flask ip-address werkzeug
我正在创建一个用户可以登录和下载文件的网站,使用 Flask micro-framework(基于 Werkzeug),它使用 Python(在我的例子中是 2.6)。
我需要在用户登录时获取他们的 IP 地址(用于记录目的)。 有谁知道如何做到这一点?当然有办法用 Python 做到这一点?
【问题讨论】:
标签: python flask ip-address werkzeug
查看how to access the Request object 上的文档,然后从同一个请求对象中获取属性remote_addr。
代码示例
from flask import request
from flask import jsonify
@app.route("/get_my_ip", methods=["GET"])
def get_my_ip():
return jsonify({'ip': request.remote_addr}), 200
有关详细信息,请参阅Werkzeug documentation。
【讨论】:
HTTP_X_FORWARDED_FOR 下的真实 IP 地址,因此请确保您不会在每次请求时都使用 localhost。
用户的IP地址可以使用如下sn-p检索:
from flask import request
print(request.remote_addr)
【讨论】:
其实你会发现,只要简单的获取以下内容,就可以得到服务器的地址:
request.remote_addr
如果您想要客户端 IP 地址,请使用以下内容:
request.environ['REMOTE_ADDR']
【讨论】:
request.remote_addr 听起来像是一个属性,应该根据反向代理是否受信任来获取远程地址。
代理可能会让这有点棘手,如果您正在使用代理,请务必查看ProxyFix (Flask docs)。在您的特定环境中查看request.environ。使用 nginx 我有时会做这样的事情:
from flask import request
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
当 nginx 等代理转发地址时,它们通常会在请求标头中的某处包含原始 IP。
更新See the flask-security implementation。再次,在实施之前查看有关 ProxyFix 的文档。您的解决方案可能会因您的特定环境而异。
【讨论】:
httpbin.org使用这种方法:
return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
【讨论】:
127.0.0.1,不是很有帮助。
这应该可以完成工作。 它提供客户端 IP 地址(远程主机)。
请注意,此代码是在服务器端运行的。
from mod_python import apache
req.get_remote_host(apache.REMOTE_NOLOOKUP)
【讨论】:
下面的代码总是给出客户端的公共 IP(而不是代理后面的私有 IP)。
from flask import request
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
print(request.environ['REMOTE_ADDR'])
else:
print(request.environ['HTTP_X_FORWARDED_FOR']) # if behind a proxy
【讨论】:
我有 Nginx 和下面的 Nginx 配置:
server {
listen 80;
server_name xxxxxx;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://x.x.x.x:8000;
}
}
@tirtha-r 解决方案对我有用
#!flask/bin/python
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/', methods=['GET'])
def get_tasks():
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
return jsonify({'ip': request.environ['REMOTE_ADDR']}), 200
else:
return jsonify({'ip': request.environ['HTTP_X_FORWARDED_FOR']}), 200
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=8000)
我的请求和响应:
curl -X GET http://test.api
{
"ip": "Client Ip......"
}
【讨论】:
如果您在其他平衡器后面使用 Nginx,例如 AWS Application Balancer,则 HTTP_X_FORWARDED_FOR 返回地址列表。可以这样修复:
if 'X-Forwarded-For' in request.headers:
proxy_data = request.headers['X-Forwarded-For']
ip_list = proxy_data.split(',')
user_ip = ip_list[0] # first address in list is User IP
else:
user_ip = request.remote_addr # For local development
【讨论】:
如果您使用的是 Gunicorn 和 Nginx 环境,那么以下代码模板适合您。
addr_ip4 = request.remote_addr
【讨论】: