2013-07-11 5 views
5

Sto eseguendo un'applicazione Django temporanea su un host che ha molti indirizzi IP. Quando si utilizza manage.py runserver 0.0.0.0:5000, in che modo il codice può vedere quale dei molti indirizzi IP della macchina è quello effettivamente colpito dalla richiesta, se ciò è possibile?Django runserver associato a 0.0.0.0, come posso ottenere quale IP ha preso la richiesta?

O, per dirla in altro modo:

Il mio ospite ha indirizzi IP 10.0.0.1 e 10.0.0.2. Quando runserver è in ascolto su 0.0.0.0, come può la mia applicazione sapere se l'utente ha colpito http://10.0.0.1/app/path/etc o http://10.0.0.2/app/path/etc?

Capisco che se lo stavo facendo con Apache potrei usare le variabili di ambiente Apache come SERVER_ADDR, ma non sto usando Apache.

Qualche idea?

EDIT

Maggiori informazioni:

sto testando un bilanciatore di carico con un piccolo Django app. Questa app è in ascolto su un numero di IP diversi e ho bisogno di sapere quale indirizzo IP viene colpito per una richiesta proveniente dal servizio di bilanciamento del carico, così posso assicurarmi che sia in equilibrio correttamente.

Non riesco a utilizzare le opzioni request.get_host() o request.META, poiché restituiscono ciò che l'utente ha digitato per eseguire il bilanciamento del carico.

Ad esempio: l'utente preme http://10.10.10.10/foo e che inoltrerà la richiesta a uno o http://10.0.0.1/foohttp://10.0.0.2/foo - ma request.get_host() tornerà 10.10.10.10, non gli IP reale del server è in ascolto.

Grazie, Ben

+0

Perché non collegarlo solo a un ip specifico? 'python manage.py runserver 10.0.0.1 (2): 5000' –

+0

Penso che cosa @Ben sta cercando di dire è come il server rileva quale IP è stato colpito con una richiesta? –

+0

Sì @GamesBrainiac, è esattamente ciò che intendo :) – Ben

risposta

5
request.get_host() 

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

ma essere consapevoli questo può essere ingannato in modo da non inoltrare la sicurezza su di esso.

Se gli utenti vedono la macchina con lo stesso indirizzo non sono sicuro che ciò sia possibile tramite runserver (si suppone che sia uno strumento di sviluppo semplice).

Forse potresti usare nginx? o se questo è solo per il test fare qualcosa di simile:

for i in 1 2 3 4 5; do manage.py runserver 10.0.0.$i:5000; done 

e poi sys.args [2] è il tuo indirizzo

+0

Scusate, avrei dovuto essere più chiaro - Ho modificato la mia risposta per includere più informazioni. – Ben

+0

ok vedo, che non so come farlo, ho aggiunto alcuni suggerimenti alla mia risposta – fsw

0

Se il vostro obiettivo è quello di garantire il bilanciamento del carico funziona correttamente, suppongo che sia non è un requisito assoluto per farlo nel codice dell'applicazione. È possibile utilizzare un analizzatore di pacchetti di rete in grado di ascoltare su un'interfaccia specifica (ad esempio, tcpdump -i <interface>) e osservare l'output.