2010-09-21 37 views
144

Estoy creando un sitio web donde los usuarios pueden iniciar sesión y descargar archivos, usando Flask micro-framework (basado en Werkzeug) que usa Python (2.6 en mi caso).Obtener la dirección IP de los visitantes

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

Respuesta

195

Consulte la documentación en how to access the Request object y luego obtenga de este mismo objeto de solicitud, el atributo remote_addr.

ejemplo 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 más información ver la Werkzeug documentation.

+2

La respuesta a continuación es mejor porque incluye una muestra de código. –

+1

Algunas veces, puede ser útil: request.access_route [0] –

+16

En cuanto a nginx, envía la dirección IP real bajo 'HTTP_X_FORWARDED_FOR' así que asegúrese de no terminar con el host local para cada solicitud. –

27

La dirección IP del usuario puede ser recuperada mediante el siguiente fragmento:

from flask import request 
print(request.remote_addr) 
+0

Esto no es así si la aplicación se ejecuta detrás de un servidor proxy como _nginx_. Que a menudo está en producción. – datashaman

67

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 la dirección IP del cliente, utilice lo siguiente:

request.environ['REMOTE_ADDR'] 
+2

Solo si está detrás de un proxy inverso, ¿no? – Ryan

+1

@minitech Yo diría que a su código no debería importarle si está detrás de un proxy o no. Si esta opción funciona confiablemente independientemente del proxy inverso y la otra asume que no está detrás de un proxy inverso, entonces esto debería ser preferido.(Probaría esto si pudiera configurar fácilmente un proxy inverso, pero eso llevaría más tiempo que el que tengo en este momento). – jpmc26

+0

@ jpmc26: No veo ninguna razón por la que deba funcionar en absoluto. 'request.remote_addr' suena como una propiedad que debería obtener una dirección remota dependiendo de si el proxy inverso es de confianza. – Ryan

59

Proxies puede hacer esto un poco complicado, asegúrese de consultar ProxyFix (Flask docs) si está utilizando uno. Eche un vistazo a request.environ en su entorno particular. Con nginx veces voy 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 el período de investigación original en algún lugar de los encabezados de la solicitud.

ActualizaciónSee the flask-security implementation. Nuevamente, revise la documentación sobre ProxyFix antes de implementarla. Su solución puede variar en función de su entorno particular.

+0

gracias. esto se debe subir – OWADVL

+2

Esto funciona cuando se configuran los campos apropiados en la configuración de su proxy inverso. Utilizado en producción. – drahnr

+2

@drahnr sí de hecho. El código anterior funciona si, por ejemplo, nginx que estableces: proxy_set_header X-Real-IP $ remote_addr; – pors

7

httpbin.org utiliza este método:

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

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) 
Cuestiones relacionadas