Obtener la dirección IP de los visitantes usando Flask for Python

Estoy creando un sitio web donde los usuarios pueden iniciar sesión y descargar archivos, utilizando el micro-marco Flask (basado en Werkzeug ) que usa Python (2.6 en mi caso).

Necesito obtener la dirección IP de los usuarios cuando inician sesión (para fines de registro). ¿Alguien sabe como hacer esto? Seguramente hay una manera de hacerlo con Python?

Consulte la documentación sobre cómo acceder al objeto de solicitud y luego obtener de este mismo objeto de solicitud, el atributo remote_addr .

Ejemplo de código

 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 

Para obtener más información, consulte la documentación de Werkzeug .

En realidad, lo que encontrará es que cuando obtenga lo siguiente obtendrá la dirección del servidor:

 request.remote_addr 

Si desea la dirección IP de los clientes, use lo siguiente:

 request.environ['REMOTE_ADDR'] 

Los proxies pueden hacer esto un poco difícil, asegúrese de revisar ProxyFix ( documentos de Flask ) si está usando uno. Eche un vistazo a request.environ en su entorno particular. Con nginx a veces haré algo como esto:

 from flask import request request.environ.get('HTTP_X_REAL_IP', request.remote_addr) 

Cuando los proxies, como nginx, las direcciones de reenvío, suelen incluir la IP original en algún lugar de los encabezados de solicitud.

Actualización Ver la implementación de seguridad flask . De nuevo, revise la documentación sobre ProxyFix antes de implementar. Su solución puede variar según su entorno particular.

La dirección IP del usuario se puede recuperar usando el siguiente fragmento de código:

 from flask import request print(request.remote_addr) 

httpbin.org utiliza este método:

 return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr)) 

Tengo Nginx y con debajo de la configuración de 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://xxxx:8000; } } 

La solución @ tirtha-r funcionó para mí

 #!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) 

Mi solicitud y respuesta:

 curl -X GET http://test.api { "ip": "Client Ip......" } 

El siguiente código siempre proporciona la IP pública del cliente (y no una IP privada detrás de un proxy).

 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 

Esto debería hacer el trabajo. Proporciona la dirección IP del cliente (host remoto).

Tenga en cuenta que este código se está ejecutando en el lado del servidor.

 from mod_python import apache req.get_remote_host(apache.REMOTE_NOLOOKUP)