Afficher l’IP d’un visiteur – Django vs Nginx | Sam & Max: Python, Django, Git et du cul

Afficher l’IP d’un visiteur – Django vs Nginx

Lorsque l’on veut connaitre son ip on fait souvent appel à des sites du genre: whatismyip.com, mon-ip.com ou on utilise un ifconfig en ssh.
Des fois on a aussi besoin de connaître l’ip d’un visiteur sur son site, 2 petites méthodes pour le faire sous Django et Nginx.

Sous Django:

Dans l’Urlconf

urlpatterns = patterns('',
    # return client IP
    url(r'^my_ip$', get_ip),
)

Créez une vue du nom de get_ip qui sera utilisée par l’urlconf

from django import http
 
def get_ip(request):
    """
        Vue qui retourne l'IP du client
    """
    try:

    	# récupère l'ip du client
        return http.HttpResponse(request.META["REMOTE_ADDR"] )

    except Exception, e:
        return http.HttpResponse('error %s' % e)

Le code ci-dessus peut retourner l’adresse locale (127.0.0.1) dans ce cas il faut tester l’existence de la variable HTTP_X_REAL_IP, certains serveurs web ont besoin d’être configuré.

Sous Nginx:

Dans le fichier de configuration de nginx on écrit une nouvelle location

# return client ip
location /my_ip {
    default_type 'text/plain';
    content_by_lua 'ngx.print(ngx.var.remote_addr)';
}

il suffit de se rendre à l’url http://monsite.com/my_ip pour voir s’afficher son ip. Cependant il faut avoir nginx compilé avec le module Lua ce qui peut être délicat si l’on a jamais compilé d’application.


Conclusion:

Si l’on s’en réfère aux deux exemples ci dessus on serait tenté d’utiliser Nginx car en une seule ligne tout le bazar est réglé.
Le hic c’est qu’il faut que Nginx soit compilé avec le module Lua pour afficher l’ip (sauf si quelqu’un connaît une autre façon d’afficher un message de sortie).
La version Django n’est pas fiable à 100% car suivant comment est configuré votre serveur web il se peut que vous vous retrouviez avec une ip du genre 127.0.0.1.
Il y a aussi la possibilité de parser le résultat des sites web cités en tout début d’article, certains proposent des Api je crois mais vous dépendez d’un autre service (on faisait ça au début) qui peuvent vous lâcher à tout moment (ce qui nous est arrivé).
Personnellement je compile toujours nginx avec Lua et quelques autres modules, ça permet de s’affranchir de plus en plus du backend.

PS: j’ai mis à jour le titre car il laissait sous-entendre autre chose (merci à Sébastien)

  11 comments for “Afficher l’IP d’un visiteur – Django vs Nginx

  1. Khertan
    25/10/2013 at 05:17

    pour une fois …

  2. Sebastien
    25/10/2013 at 07:11

    La vraie ip.. hmm, ou celle du proxy…

  3. Max
    25/10/2013 at 07:26

    mmm le titre peut paraitre tendencieux en effet si on parle de proxy du genre surf anonyme.

  4. 25/10/2013 at 07:55

    On utilise “ip addr” en ssh, ifconfig est déprécié. Ouais, je suis aigri, je sais :D .

  5. Max
    25/10/2013 at 09:01

    merci pour ip addr je connaissais pas :)

  6. 25/10/2013 at 09:06

    Mais de rien, c’est toujours un plaisir. Il faut arriver à se faire à la sortie de la commande, quand on est habitué à ifconfig et route (oui, car y’a aussi “ip route”). Mais une fois que cette étape est franchie, ip est vraiment plus souple et il centralise toutes les commandes réseaux.

    Ça t’intéresserait que je fasse un billet pour le blog là dessus ?

  7. Max
    25/10/2013 at 12:18

    Ha mais avec le plus grand plaisir très cher, les billets c’est comme la bonne choucroute, on s’en lasse pas !
    Et c’est tout à ton honneur.

  8. Sam
    25/10/2013 at 12:33

    Carrément. On t’envois un petit mail.

  9. Greg
    25/10/2013 at 15:03

    Juste pour info, c’est quoi les modules supplémentaires avec lesquel tu compile ton nginx ? Je vais passer de apache à nginx sous peu et tant qu’à faire, autant avoir un truc un peu complet pour pas me retrouver à devoir recompiler le bazar toutes les 2 semaines.

  10. Max
    25/10/2013 at 16:08

    @ greg faudrait en faire un article ptet du coup …

    https://github.com/agentzh/redis2-nginx-module.git
    pour taper directement dans Redis

    https://github.com/chaoslawful/lua-nginx-module
    pour le Lua, c très pratique et super puissant

    https://github.com/agentzh/set-misc-nginx-module
    md5, base64 encodeing, decoding, et d’autres trucs

    http_gzip_static_module
    faut l’activer c pas d’origine, pour le gzip (compression des pages à la volée)

    d’autres modules pour l’upload de fichiers:
    https://github.com/vkholodkov/nginx-upload-module.git
    https://github.com/masterzen/nginx-upload-progress-module.git

    –with-http_flv_module –with-http_mp4_module –with-http_secure_link_module –with-file-aio

    streaming flv et mp4
    liens sécurisés d’access à un url
    aio = un truc pour que ça aille plus vite :) (j’aime la précision)

  11. Baronsed
    25/10/2013 at 19:57

    Quand on veut avoir rapidement son ip depuis un script shell :
    curl ifconfig.me

Leave a Reply

Your email address will not be published. Required fields are marked *