django zmień domyślny port serwera uruchomieniowego


130

Chciałbym, aby domyślny port, który manage.py runservernasłuchuje, był możliwy do określenia w obcym config.ini. Czy istnieje łatwiejsze rozwiązanie niż analizowanie sys.argvwewnątrz manage.pyi wstawianie skonfigurowanego portu?

Celem jest uruchomienie ./manage.py runserverbez konieczności określania adresu i portu za każdym razem, ale pobranie argumentów z config.ini.


Jeśli uruchomisz polecenie z historii linii poleceń, oznacza to jeszcze mniej naciśnięć klawiszy. Na przykład dla mnie jest to „<ctrl-r> uruchamia <enter>” i automatycznie uruchamia to samo polecenie co ostatnim razem, więc port itp. Jest uwzględniony.
Jonathan Hartley

Odpowiedzi:


176

utwórz skrypt bash z następującymi elementami:

#!/bin/bash
exec ./manage.py runserver 0.0.0.0:<your_port>

zapisz go jako serwer uruchomieniowy w tym samym katalogu, co manage.py

chmod +x runserver

i uruchom go jako

./runserver

Albo to, albo myślę o dodaniu niestandardowego polecenia zarządzania.
jonny

Nie można programowo uruchomić serwera deweloperskiego, więc niestandardowe polecenie nie zadziała, chyba że wywoła powłokę przy użyciu czegoś podobnego call. Jeśli to rozwiązanie działa w Twoim przypadku, zaznacz je jako rozwiązane.
Pablo Albornoz

Właściwie zacząłem używać supervisortego teraz, dzięki czemu zarządzanie jest jeszcze łatwiejsze. :-) Ale twoje jest prawdopodobnie najczystszym rozwiązaniem poza pisaniem dedykowanego runserverskryptu.
jonny

Supervisor to dobre rozwiązanie, ponieważ nie polecałbym go do uruchamiania środowiska programistycznego. Tracisz korzyść wynikającą między innymi z posiadania wyjścia serwera na terminalu. Jeśli naprawdę chcesz używać przełożonego, radzę używać go z w pełni funkcjonalnym serwerem WSGI, takim jak Gunicorn. Proszę nie uruchamiać serwera deweloperskiego jako serwera produkcyjnego ...
Pablo Albornoz

Jest to przydatne, ale niezbyt przyjemne, gdy żonglujesz wieloma projektami na raz - zaakceptowałbym poniższą odpowiedź, która określa port, który ma być używany dla każdego odrębnego projektu. Tylko moja opinia.

105

Właściwie najłatwiejszym sposobem zmiany (jedynego) portu w rozwoju serwera Django jest:

python manage.py runserver 7000

który powinien uruchomić serwer deweloperski pod adresem http://127.0.0.1:7000/


2
Ta odpowiedź dotyczy zmiany portu, a nie zmiany portu domyślnego.
fizyczne

42

Począwszy od Django 1.9, najprostszym rozwiązaniem, jakie znalazłem (opartym na rozwiązaniu Quentina Stafford-Frasera), jest dodanie kilku wierszy, w manage.pyktórych dynamicznie modyfikujemy domyślny numer portu przed wywołaniem runserverpolecenia:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.dev")

    import django
    django.setup()

    # Override default port for `runserver` command
    from django.core.management.commands.runserver import Command as runserver
    runserver.default_port = "8080"

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Chociaż nie odpowiada dokładnie na pierwotne pytanie, a wcięcia są pomieszane (kod powinien być wcięty od "import django" w dół), wolę tę odpowiedź ponieważ jest całkowicie samowystarczalna i nie wymaga zmiany tego co jest wprowadzane w wierszu poleceń.
PurpleDiane

1
@PurpleDiane Wcięcie jest naprawione.
Flimm

Mój manage.py tak naprawdę nie wygląda, chyba Django się zmienił od
NaturalBornCamper

6
Obecnie (od 2.0.3) możesz po prostu dodać: from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080do pliku manage.py. Możesz także zmienić adres odsłuchu za pomocą:runserver.default_addr
Vargas

30

Wszystkie poniższe polecenia są możliwe do zmiany portu podczas działania django:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000

1
„Celem jest uruchomienie serwera ./manage.py bez konieczności podawania adresu i portu za każdym razem”
JuSTMOnIcAjUSTmONiCAJusTMoNICa

11

Utwórz podklasę django.core.management.commands.runserver.Commandi nadpisz default_portczłonka. Zapisz plik jako własne polecenie zarządzania, np. Pod <app-name>/management/commands/runserver.py:

from django.conf import settings
from django.core.management.commands import runserver

class Command(runserver.Command):
    default_port = settings.RUNSERVER_PORT

Wczytuję tutaj domyślne ustawienia formularza portu (który z kolei odczytuje inne pliki konfiguracyjne), ale równie dobrze możesz je odczytać bezpośrednio z innego pliku.


Wydaje się, że jest to najlepsze rozwiązanie, jednak moje Django 1.8.14 nie rozpoznaje mojego samodzielnie utworzonego pliku runserver.py. Powinienem to gdzieś zarejestrować?
fizyczne

@physicalattraction Twój plik prawdopodobnie nie znajduje się we właściwej lokalizacji. docs.djangoproject.com/en/2.0/howto/custom-management-commands zaczyna się od opisu miejsca umieszczenia modułu Pythona dla runserverpolecenia. Również może masz inna aplikacja również rejestracji polecenia nazwie runserver. Spróbuj zmienić nazwę polecenia i sprawdź, czy zostało rozpoznane.
Feuermurmel

1
Włożyłem go <app_name>/management/commands/runserver.py, ale potem runserverużywany jest oryginał Django . Kiedy zmieniam jego nazwę na run_server.py, jest rozpoznawany. Nie widzę nic specjalnego runserverna stronie, do której prowadzi link.
fizyczne

Chodzi o to, że staticfilesrobi dokładnie to, co sugerujesz . Postępowanie zgodnie z instrukcjami przerywa obsługę plików statycznych w trakcie opracowywania. Najlepiej importować z django.contrib.staticfiles.management.commands.
x-yuri

8

Stworzyliśmy nowe polecenie zarządzania serwerem uruchomieniowym, które jest cienkim opakowaniem wokół standardowego, ale zmienia domyślny port. Z grubsza tworzysz management/commands/runserver.pyi umieszczasz coś takiego:

# Override the value of the constant coded into django...
import django.core.management.commands.runserver as runserver
runserver.DEFAULT_PORT="8001"

# ...print out a warning...
# (This gets output twice because runserver fires up two threads (one for autoreload).
#  We're living with it for now :-)
import os
dir_path = os.path.splitext(os.path.relpath(__file__))[0]
python_path = dir_path.replace(os.sep, ".")
print "Using %s with default port %s" % (python_path, runserver.DEFAULT_PORT)

# ...and then just import its standard Command class.
# Then manage.py runserver behaves normally in all other regards.
from django.core.management.commands.runserver import Command


1

Jestem bardzo spóźniony na imprezę tutaj, ale jeśli używasz IDE, takiego jak PyCharm, jest opcja w „Edytuj konfiguracje” w menu „Uruchom” (Uruchom> Edytuj konfiguracje), gdzie możesz określić domyślny port. Ma to oczywiście znaczenie tylko wtedy, gdy debugujesz / testujesz za pośrednictwem PyCharm.


1

Jeśli chcesz zmienić domyślne konfiguracje, wykonaj następujące kroki:

  1. Otwórz polecenie typu terminala

     $ /usr/local/lib/python<2/3>.x/dist-packages/django/core/management/commands
  2. Teraz otwórz plik runningerver.py w edytorze nano jako superużytkownik

     $ sudo nano runserver.py
  3. znajdź zmienną „default_port”, a zobaczysz domyślny numer portu „8000”. Teraz możesz to zmienić na cokolwiek chcesz.

  4. Teraz wyjdź i zapisz plik za pomocą „CTRL + X i Y, aby zapisać plik”

Uwaga: Zastąp <2/3> .x swoją używalną wersją Pythona


0
  1. Utwórz zmienną środowiskową w swoim .bashrc

    eksport RUNSERVER_PORT = 8010

  2. Utwórz alias

    alias runningerver = 'django-admin runningerver $ RUNSERVER_PORT'

Używam opakowania zsh i virtualenvs. Umieszczam eksport w projektach po aktywacji skryptu i przypisuję port dla każdego projektu.

workon someproject
runserver

-2

To jest stary post, ale dla zainteresowanych:

Jeśli chcesz zmienić domyślny numer portu, aby po uruchomieniu polecenia „runningerver” rozpocząć od preferowanego portu, wykonaj następujące czynności:

  1. Znajdź swoją instalację Pythona. (możesz mieć zainstalowanych wiele pythonów i możesz mieć również wersję środowiska wirtualnego, więc upewnij się, że znalazłeś właściwą)
  2. W folderze Python znajdź folder site-packages. Wewnątrz znajdziesz swoją instalację django
  3. Otwórz folder django-> core -> management -> commands
  4. W folderze poleceń otwórz skrypt runningerver.py z edytorem tekstu
  5. Znajdź pole DEFAULT_PORT. domyślnie wynosi 8000. Zmień to na co chcesz DEFAULT_PORT = "8080"
  6. Zrestartuj serwer: python manage.py runerver i sprawdź, czy używa twojego ustawionego numeru portu

Działa z Pythonem 2.7, ale powinien działać również z nowszymi wersjami Pythona. Powodzenia


11
To jest najgorsza propozycja ze wszystkich tutaj. IMHO, edycja pliku z dystrybucji nigdy nie jest dobrym pomysłem i prowadzi do nieporozumień, ponieważ zmiana nie jest śledzona przez VCS i można ją łatwo nadpisać.
Feuermurmel

Nie zaleca się edytowania modułu Django w pakietach witryny. Może zostać zaktualizowany przez nową wersję. Ma to również wpływ na wszystkie aplikacje Django.
Sathindu Kavneth

-3

Zmagałem się z tym samym problemem i znalazłem jedno rozwiązanie. Myślę, że to może ci pomóc. po uruchomieniu python manage.py runserverprzyjmie 127.0.0.1 jako domyślny adres IP i 8000 jako domyślny numer portu, który można skonfigurować w środowisku Pythona. W ustawieniach Pythona przejdź do <your python env>\Lib\site-packages\django\core\management\commands\runserver.pyi ustaw 1. default_port = '<your_port>'
2. znajdź to pod uchwytem def i ustaw
if not options.get('addrport'): self.addr = '0.0.0.0' self.port = self.default_port

Teraz, jeśli uruchomisz „python manage.py runningerver”, będzie on działał domyślnie na „0.0.0.0”:

Miłego kodowania .....


3
Modyfikowanie źródeł pakietów zależnych jest uważane za złą praktykę. Zmiany mogą zostać utracone podczas aktualizacji / ponownej instalacji.
arogaczow

Zgadza się @arogachev, to tylko opcja, dzięki której możesz ustawić domyślny port i host. Ale modyfikowanie pakietów zależnych naprawdę nie jest dobrą praktyką. możesz ustawić adres IP i port również po uruchomieniu serwera w wierszu poleceń.
Amrendra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.