¿Cómo obtener la dirección IP del usuario usando Flask?

En este tutorial, veremos cómo obtener la dirección IP del usuario que visita una aplicación web creada con Flask.

Introducción

Flask es uno de los marcos de desarrollo web de Python más populares. Es un marco web liviano, pero ofrece una variedad de métodos integrados que se pueden usar para la implementación sin problemas de aplicaciones web eficientes.

En esta guía, obtendremos la dirección IP del usuario que visita la aplicación web creada con Flask.

Crearemos una API REST simple que maneje las solicitudes entrantes al punto final /, devolviendo la dirección IP del usuario como respuesta.

Creación de una aplicación web básica mediante Flask

Cree un nuevo proyecto Flask para este tutorial. Crearemos una aplicación básica que devuelva "Hello World" con solicitudes al extremo /:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from flask import Flask

# Creating the instance of the class Flask
app = Flask(__name__)

# Using the decorator to create the URL for the web application
@app.route('/')
# The function will return the information displayed on the webpage
def hello_world():
    return '<h1> Hello World</h1>'

# Run the application
if __name__ == '__main__':
    app.run(debug=True)

Ahora que tenemos nuestra aplicación configurada, recopilemos las direcciones IP asociadas con la solicitud de un usuario.

¿Cómo encontrar la dirección IP de un usuario en Flask?

Cada vez que un cliente solicita una página, envía una solicitud HTTP GET, con una cierta carga útil. Entre otra información, se incluye su dirección IP distintiva. En Flask, cada ruta tiene acceso a la variable request, que representa la solicitud entrante del usuario.

De esta solicitud, podemos extraer varios elementos, y la dirección IP se denota como la propiedad remote_addr:

1
2
3
4
@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1> Your IP address is:' + ip_addr

También podemos obtener la dirección remota a través del entorno del contexto de la solicitud. El diccionario environ del objeto request contiene varias claves y sus respectivos valores, pertenecientes a la solicitud. REMOTE_ADDR es una de las variables del servidor (claves) que se asigna a la dirección IP del cliente o del servidor:

1
2
3
4
@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1> Your IP address is:' + ip_addr

Pero las dos opciones anteriores no funcionarán si su usuario realiza una solicitud detrás de un proxy. En ese caso, tenemos que verificar los encabezados de la solicitud. En particular, estamos buscando el encabezado HTTP_X_FORWARDED_FOR:

1
2
3
4
@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ['HTTP_X_FORWARDED_FOR']
    return '<h1> Your IP address is:' + ip_addr

Ahora, incluso este enfoque no funcionaría si el encabezado no está configurado. Entonces, una estrategia común es usar el método get() para que, si el encabezado no está configurado, podamos usar la dirección remota por defecto:

1
2
3
4
@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1> Your IP address is:' + ip_addr

{.icon aria-hidden=“true”}

Nota: Intentar obtener un valor de una clave inexistente devuelve Ninguno. El método get() de la clase dict le permite establecer un valor predeterminado que se utilizará si get() no encuentra una clave. Si HTTP_X_FORWARDED_FOR es Ninguno, se usa el valor request.remote_addr en su lugar.

Con esto en mente, podemos elegir cualquiera de los siguientes tres enfoques para obtener la dirección IP de un usuario, a través de su solicitud entrante:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1> Your IP address is:' + ip_addr


@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1> Your IP address is:' + ip_addr


@app.route('/client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1> Your IP address is:' + ip_addr


if __name__ == '__main__':
    app.run(debug=True)

Conclusión

En este artículo, aprendimos tres métodos diferentes para obtener la dirección IP de un usuario. Accedemos a la dirección remota directamente con request.remote_addr, a través de la clave REMOTE_ADDR de request.environ, y en los casos en que el usuario esté usando un proxy debemos revisar la clave HTTP_X_FORWARDED_FOR de request.environ `.