Obtener la dirección IP de los visitantes usando Frasco para Python
-
04-10-2019 - |
Pregunta
Estoy haciendo un sitio web donde los usuarios pueden iniciar sesión y descargar archivos, utilizando la Frasco micro-marco (basado en Werkzeug ), que utiliza Python (2.6 en mi caso).
necesito para obtener la dirección IP de los usuarios cuando inician sesión (para propósitos de registro). ¿Alguien sabe como hacer esto? Sin duda, hay una manera de hacerlo con Python?
Solución
Consulte la documentación de cómo acceder a la solicitud objeto a continuación, obtener de esta misma solicitud objeto, el remote_addr
atributo.
Código de ejemplo
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 Werkzeug documentación .
Otros consejos
La representación puede hacer esto un poco complicado, asegúrese de revisar ProxyFix ( Frasco documentos ) si está utilizando una. Echar un vistazo a request.environ
en su entorno particular. Con nginx a veces a hacer algo como esto:
from flask import request
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
Cuando proxies, como Nginx, direcciones hacia adelante, por lo general incluyen la IP original en algún lugar en las cabeceras de petición.
Actualizar Ver la matraz de seguridad aplicación. Una vez más, revise la documentación sobre ProxyFix antes de implementar. Su solución puede variar en función de su entorno particular.
En realidad, lo que se encontrará es que cuando simplemente conseguir la siguiente te llevará a la dirección del servidor:
request.remote_addr
Si desea que los clientes dirección IP, a continuación, utilizar la siguiente:
request.environ['REMOTE_ADDR']
La dirección IP del usuario puede ser recuperada mediante el siguiente fragmento:
from flask import request
print(request.remote_addr)
Tengo Nginx y a continuación con Nginx Config
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;
}
}
solución
#!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......"
}
httpbin.org utiliza este método:
return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
El código de abajo siempre da 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 ejecuta en el lado del servidor.
from mod_python import apache
req.get_remote_host(apache.REMOTE_NOLOOKUP)