2011-11-06 3 views
6

Heroku envía un proxy de las solicitudes de un cliente al servidor, por lo que debe analizar el X-Forwarded-For para encontrar la dirección IP de origen.Parse X-Forwarded-For para obtener ip con werkzeug en Heroku

El formato general de los X-reenviado-A es:

X-Forwarded-For: client1, proxy1, proxy2 

Usando werkzeug en frasco, que estoy tratando de llegar a una solución con el fin de acceder a la IP de origen del cliente.

¿Alguien sabe una buena manera de hacer esto?

Gracias!

Respuesta

15

Werkzeug (y Flask) encabezados de tienda en una instancia de werkzeug.datastructures.Headers. Usted debe ser capaz de hacer algo como esto:

provided_ips = request.headers.getlist("X-Forwarded-For") 
# The first entry in the list should be the client's IP. 

Alternativamente, se puede usar request.access_route (gracias @Bastian por señalarlo!):

provided_ips = request.access_route 
# First entry in the list is the client's IP 
+1

es posible que desee comprobar http://werkzeug.pocoo.org/docs/wrappers/#werkzeug. wrappers.BaseRequest.access_route – Bastian

+0

@Bastian el enlace que publica dice "si el encabezado reenviado existe", que entiendo sería 'X-Forwarded-For', por lo que en caso de que el encabezado reenviado no exista, la función access_route funcionará, no lo hago tener un lugar donde probar mi aplicación de matraz que no sea heroku. –

2

Esto es lo que yo uso en Django. Consulte esto https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

Nota: Al menos en Heroku HTTP_X_FORWARDED_FOR será una matriz de direcciones IP. El primero es el IP del cliente, el resto son direcciones IP del servidor proxy.

en settings.py:

USE_X_FORWARDED_HOST = True 

en su views.py:

if 'HTTP_X_FORWARDED_FOR' in request.META: 
    ip_adds = request.META['HTTP_X_FORWARDED_FOR'].split(",") 
    ip = ip_adds[0] 
else: 
    ip = request.META['REMOTE_ADDR'] 
+0

Lea [esta nota acerca de la última IP en 'X-Forwarded-For' es la única confiable en Heroku] (http://stackoverflow.com/a/18517550/429091) (a menos que confíe en clientes de fuera de Heroku no mentir sobre ellos mismos ... – binki