Jak uzyskać dostęp do lokalnego serwera WWW Django ze świata zewnętrznego

176

Postępowałem zgodnie z instrukcjami tutaj, aby uruchomić Django przy użyciu wbudowanego serwera internetowego i udało mi się go pomyślnie uruchomić przy użyciu python manage.py runserver. Jeśli uzyskam dostęp do 127.0.0.1:port lokalnie z serwera WWW, otrzymam stronę Django wskazującą, że działa.

Zdaję sobie sprawę, że serwer WWW Django nie jest serwerem produkcyjnym, ale do celów testowych ważne jest dla mnie, aby mieć do niego dostęp ze świata zewnętrznego - tj. Nie z przeglądarki internetowej na serwerze, ale z innego komputera.

Próbowałem:

http://mywebserver:port_django_runs_on

ale to nie zadziałało. Próbowałem również użyć adresu IP (w oparciu o ifconfig), aby uzyskać dostęp:

http://myipaddress:port_django_runs_on 

który też nie działał.

Serwer WWW działa, więc musi być dostępny z zewnątrz, po prostu nie wiem jak. Używam Linuksa z Apache, chociaż nie skonfigurowałem Django z Apache.

Jakieś pomysły, jak to zrobić?

Blaszany Człowiek
źródło
3
Dlaczego nie skonfigurować Django z Apache i mod_wsgi? Dlaczego nie zrobić tego poprawnie?
S.Lott
@ S.Lott A co, jeśli masz wiele różnych projektów na serwerze, które chcesz uruchamiać w różnym czasie i nie chcesz ponownie konfigurować Apache za każdym razem, gdy dodajesz nowy projekt?
robenkleene
Czy to odpowiada na twoje pytanie? Jak upublicznić devserver Django? Czy to ogólnie możliwe?
alexdlaird

Odpowiedzi:

303

Musisz uruchomić serwer deweloperski tak, aby nasłuchiwał na interfejsie Twojej sieci.

Na przykład

python manage.py runserver 0.0.0.0:8000

nasłuchuje na każdym interfejsie na porcie 8000.

Nie ma znaczenia, czy uzyskujesz dostęp do serwera WWW za pomocą adresu IP czy nazwy hosta. Myślę, że nadal jesteś we własnej sieci LAN.
Jeśli naprawdę chcesz uzyskać dostęp do serwera z zewnątrz, musisz również skonfigurować router, aby przekierowywał port, np. 8000Do serwera.


Sprawdź swoją zaporę na serwerze, czy połączenia przychodzące do używanego portu są dozwolone!

Zakładając, że możesz pomyślnie uzyskać dostęp do serwera Apache z zewnątrz, możesz również spróbować tego:

  • Zatrzymaj serwer Apache, aby port 80był wolny.
  • Uruchom serwer deweloperski z sudo python manage.py runserver 0.0.0.0:80
Felix Kling
źródło
1
Użycie „python manage.py runningerver 0.0.0.0:8000” nadal daje ten sam wynik. Czy mógłbyś powiedzieć więcej o tym, jak mogę skonfigurować Apache do obsługi tego portu?
1
@ user248237: Uruchamiasz serwer deweloperski, jest to całkowicie niezwiązane z serwerem WWW Apache. Serwer deweloperski to samodzielny serwer WWW.
Felix Kling
Do korzystania z portu 80 wymagane są specjalne uprawnienia. Możesz spróbować sudo python manage.py runserver 80.
S.Lott,
@ S.Lott: Och, dziękuję. Wiem, to było w mojej głowie tak, jak to napisałem, ale jakoś nie dotarło do klawiatury;)
Felix Kling
1
Umożliwienie wszystkim ALLOWED_HOSTS = ['*']pracującym dla mnie dostępu do aplikacji Django na komputerze Mac z mojego telefonu z Androidem
Anupam,
28

Musiałem dodać tę linię do settings.py, aby działała (w przeciwnym razie pokazywał błąd podczas uzyskiwania dostępu z innego komputera)

ALLOWED_HOSTS = ['*']

następnie uruchomiłem serwer z:

python manage.py runserver 0.0.0.0:9595

Upewnij się również, że zapora zezwala na połączenia z tym portem

Bonfix Ngetich
źródło
14

Wybierz co najmniej jeden z:

  • Twoja aplikacja nie nasłuchuje na zamierzonym IP: PORT
    • Ponieważ nie skonfigurowałeś go pomyślnie
    • Ponieważ użytkownik nie ma uprawnień do
  • Twoja aplikacja pomyślnie nasłuchuje na zamierzonym IP: PORT, ale klienci nie mogą się z nim połączyć, ponieważ
    • Lokalne iptables serwera zapobiega temu.
    • Zapora ogniowa temu zapobiega.

Możesz więc sprawdzić, czy aplikacja nasłuchuje pomyślnie, uruchamiając lsof -ijako root na komputerze i poszukaj pythonwpisu z odpowiednim określonym portem.

Użytkownicy inni niż root zazwyczaj nie mogą łączyć się z portami <1024.

Będziesz musiał iptables -nvLsprawdzić, czy istnieje reguła, która uniemożliwiłaby dostęp do adresu ip: port, z którym próbujesz powiązać swoją aplikację.

Jeśli istnieje zapora nadrzędna i niewiele o niej wiesz, musisz porozmawiać z administratorami sieci.

MattH
źródło
czy możesz wyjaśnić you haven't configured it successfully?
ChillarAnand
@ChillarAnand: po prostu sprawdź, czy django runserverfaktycznie nasłuchuje tam, gdzie zamierzasz, np lsof. Używając .
MattH,
@ChillarAnand ja przeszedłem przez kroki, które poleciłeś. Używając lsof, widzę wpis w Pythonie dla mojego portu. Ale mój link, czyli myip: 8000 nie odpowiada. Wiem, że jest późno, ale wszelkie sugestie pomogą.
WaterRocket8236
8

po prostu zrób to:

python manage.py runserver 0:8000

za pomocą powyższego polecenia faktycznie wiążesz go z zewnętrznym adresem IP. więc teraz, gdy uzyskasz dostęp do swojego adresu IP za pomocą numeru portu, będziesz mógł uzyskać do niego dostęp w przeglądarce bez żadnego problemu.

wystarczy wpisać w pasku adresu przeglądarki:

<your ip address>:8000

na przykład:

192.168.1.130:8000

być może będziesz musiał edytować settings.py, dodaj następujące elementy w settings.py w ostatniej linii:

ALLOWED_HOSTS = ['*']

mam nadzieję, że to pomoże ...

Joish
źródło
5

Dla użytkowników AWS.

Aby się tam dostać, musiałem wykonać następujące kroki.

1) Upewnij się, że pip i django są zainstalowane na poziomie sudo

  • sudo apt-get install python-pip
  • sudo pip zainstaluj django

2) Upewnij się, że reguły związane z grupą zabezpieczeń obejmują http na porcie 80 dla 0.0.0.0/0

  • konfigurowane za pomocą konsoli AWS

3) Dodaj publiczny adres IP i DNS do ALLOWED_HOSTS

  • ALLOWED_HOSTS to obiekt listy, który można znaleźć w settings.py
  • ALLOWED_HOSTS = ["75.254.65.19", "ec2-54-528-27-21.compute-1.amazonaws.com"]

4) Uruchom serwer deweloperski z sudo na porcie 80

  • sudo python manage.py runerver 0:80

Witryna jest teraz dostępna pod jednym z poniższych (nie ma potrzeby: 80, ponieważ jest to ustawienie domyślne dla http):

  • [Publiczny DNS] tj. Ec2-54-528-27-21.compute-1.amazonaws.com
  • [Publiczny adres IP], tj. 75.254.65.19
datavoredan
źródło
2

Dodam to tutaj:

  1. sudo python manage.py runserver 80

  2. Przejdź do telefonu lub komputera i wprowadź wewnętrzny adres IP komputera (np. 192.168.0.12) Do przeglądarki.

W tym momencie powinieneś być połączony z serwerem Django.

Powinno to również działać bez sudo:

python manage.py runserver 0.0.0.0:8000
James111
źródło
0

Jeśli używasz Dockera, musisz upewnić się, że porty również są widoczne

Amjad Al Taleb
źródło
0

AKTUALIZACJA 2020 WYPRÓBUJ W TEN SPOSÓB

python manage.py runserver yourIp:8000

ALLOWED_HOSTS = ["*"]
Kashif
źródło