django cambia la porta del server di esecuzione predefinita


130

Vorrei rendere la porta predefinita che manage.py runserverascolta specificabile in un estraneo config.ini. Esiste una soluzione più semplice dell'analisi sys.argvall'interno manage.pye dell'inserimento della porta configurata?

L'obiettivo è quello di eseguire ./manage.py runserversenza dover specificare indirizzo e porta ogni volta ma facendo in modo che prenda gli argomenti dal file config.ini.


Se esegui il comando dalla cronologia della riga di comando, il numero di sequenze di tasti è ancora inferiore. Ad esempio, per me è "<ctrl-r> esegue <enter>", ed esegue automaticamente lo stesso comando dell'ultima volta, quindi la porta ecc. È inclusa.
Jonathan Hartley

Risposte:


176

creare uno script bash con quanto segue:

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

salvalo come runerver nella stessa directory di manage.py

chmod +x runserver

ed eseguilo come

./runserver

O quello o sto pensando di aggiungere un comando di gestione personalizzato.
jonny

Non è possibile eseguire il server di sviluppo a livello di programmazione, quindi un comando personalizzato non funzionerà a meno che non chiami la shell utilizzando qualcosa di simile call. Se questa soluzione funziona per te, assicurati di contrassegnarla come risolta.
Pablo Albornoz

In realtà ho iniziato a usarlo supervisoradesso, il che lo rende ancora più facile da gestire. :-) Ma la tua è probabilmente la soluzione più pulita oltre a scrivere uno runserverscript dedicato .
jonny

Supervisor è una buona soluzione perché non lo consiglierei per eseguire l'ambiente di sviluppo. Si perde il vantaggio di avere l'output del server sul terminale, tra le altre cose. Se vuoi davvero usare il supervisore, il mio consiglio sarebbe di usarlo con un server WSGI completo come Gunicorn. Per favore, non eseguire il server di sviluppo come server di produzione ...
Pablo Albornoz

Questo è utile ma non ottimo quando si destreggiano più progetti contemporaneamente: avrei accettato la risposta di seguito che specifica la porta da utilizzare per ogni progetto distinto. Solo la mia opinione però.

105

In realtà il modo più semplice per cambiare (solo) la porta nel server Django di sviluppo è proprio come:

python manage.py runserver 7000

che dovrebbe eseguire il server di sviluppo su http://127.0.0.1:7000/


2
Questa risposta riguarda la modifica della porta, non la modifica della porta predefinita.
fisica

42

A partire da Django 1.9, la soluzione più semplice che ho trovato (basata sulla soluzione di Quentin Stafford-Fraser) è aggiungere alcune righe a manage.pycui modificare dinamicamente il numero di porta predefinito prima di invocare il runservercomando:

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)

Sebbene non risponda esattamente alla domanda originale e il rientro sia incasinato (il codice dovrebbe essere rientrato da "import django" in giù), preferisco questa risposta perchéècompletamente autonoma e non richiede la modifica di ciò che viene inserito sulla riga di comando.
PurpleDiane

1
@PurpleDiane Il rientro è stato risolto.
Flimm

Il mio manage.py non sembra proprio così, immagino che Django sia cambiato da allora
NaturalBornCamper

6
Attualmente (a partire dalla 2.0.3) puoi semplicemente aggiungere: from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080al tuo manage.py. Puoi anche cambiare l'indirizzo di ascolto con:runserver.default_addr
Vargas

30

Tutti i seguenti comandi sono possibili per cambiare la porta durante l'esecuzione di django:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000

1
"L'obiettivo è eseguire ./manage.py runserver senza dover specificare ogni volta indirizzo e porta"
JuSTMOnIcAjUSTmONiCAJusTMoNICa

11

Crea una sottoclasse django.core.management.commands.runserver.Commande sovrascrivi il default_portmembro. Salva il file come comando di gestione personale, ad esempio sotto <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

Sto caricando le impostazioni del modulo di porta predefinito qui (che a sua volta legge altri file di configurazione), ma potresti anche leggerlo direttamente da qualche altro file.


Questa sembra la soluzione migliore, tuttavia, il mio Django 1.8.14 non riconosce il mio file auto-creato runserver.py. Devo registrarlo da qualche parte?
fisica

@physicalattraction Il tuo file probabilmente non è nella posizione corretta. docs.djangoproject.com/en/2.0/howto/custom-management-commands inizia con una descrizione di dove mettere il modulo python per il runservercomando. Inoltre forse hai un'altra app che registra anche un comando denominato runserver. Prova a rinominare il comando e verifica se viene riconosciuto.
Feuermurmel,

1
L'ho inserito <app_name>/management/commands/runserver.py, ma poi runserverviene utilizzato l'originale di Django . Quando lo rinomino in run_server.py, viene riconosciuto. Non vedo nulla di speciale runservernella pagina a cui ti colleghi.
fisica

Il fatto è che staticfilesfa esattamente quello che suggerisci . Quindi seguire le istruzioni interrompe il servizio di file statici in fase di sviluppo. È meglio importare da django.contrib.staticfiles.management.commands.
x-yuri

8

Abbiamo creato un nuovo comando di gestione "runserver" che è un involucro sottile attorno a quello standard ma cambia la porta predefinita. Approssimativamente, crei management/commands/runserver.pye inserisci qualcosa del genere:

# 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

2

In Pycharm puoi semplicemente aggiungere la porta ai parametri

inserisci qui la descrizione dell'immagine


1

Sono molto in ritardo per la festa qui, ma se usi un IDE come PyCharm, c'è un'opzione in "Modifica configurazioni" nel menu "Esegui" (Esegui> Modifica configurazioni) dove puoi specificare una porta predefinita. Questo ovviamente è rilevante solo se stai eseguendo il debug / test tramite PyCharm.


1

Se desideri modificare le configurazioni predefinite, segui questi passaggi:

  1. Apri il comando del tipo di terminale

     $ /usr/local/lib/python<2/3>.x/dist-packages/django/core/management/commands
  2. Ora apri il file runserver.py nell'editor nano come superutente

     $ sudo nano runserver.py
  3. trova la variabile "default_port" e vedrai che il numero di porta predefinito è "8000". Ora puoi cambiarlo in quello che vuoi.

  4. Ora esci e salva il file usando "CTRL + X e Y per salvare il file"

Nota: sostituisci <2/3> .x con la tua versione utilizzabile di python


0
  1. Crea una variabile di ambiente nel tuo .bashrc

    esporta RUNSERVER_PORT = 8010

  2. Crea alias

    alias runserver = 'django-admin runserver $ RUNSERVER_PORT'

Sto usando zsh e virtualenvs wrapper. Inserisco export nei progetti script postattivato e asign port per ogni progetto.

workon someproject
runserver

-2

Questo è un vecchio post ma per coloro che sono interessati:

Se vuoi cambiare il numero di porta predefinito così quando esegui il comando "runserver" inizi con la tua porta preferita, fai così:

  1. Trova la tua installazione di Python. (puoi avere più pitoni installati e puoi avere anche la tua versione dell'ambiente virtuale, quindi assicurati di trovare quella giusta)
  2. All'interno della cartella python, individua la cartella dei pacchetti del sito. Al suo interno troverai la tua installazione di django
  3. Apri la cartella django-> core -> gestione -> comandi
  4. All'interno della cartella dei comandi, apri lo script runserver.py con un editor di testo
  5. Trova il campo DEFAULT_PORT. è uguale a 8000 per impostazione predefinita. Cambialo in quello che preferisci DEFAULT_PORT = "8080"
  6. Riavvia il server: python manage.py runserver e verifica che utilizzi il numero di porta impostato

Funziona con python 2.7 ma dovrebbe funzionare anche con le versioni più recenti di python. In bocca al lupo


11
Questo è il peggior suggerimento di tutti qui. IMHO, modificare un file da una distribuzione non è mai una buona idea e crea confusione perché la modifica non viene tracciata da un VCS e viene facilmente sovrascritta.
Feuermurmel

Non è consigliabile modificare il modulo Django nei pacchetti del sito. Può essere aggiornato da una nuova versione. Inoltre influisce su tutte le app Django.
Sathindu Kavneth,

-3

Stavo lottando con lo stesso problema e ho trovato una soluzione. Immagino possa aiutarti. quando si esegue python manage.py runserver, ci vorrà 127.0.0.1 come indirizzo ip predefinito e 8000 come numero di porta predefinito che può essere configurato nel proprio ambiente python. Nelle impostazioni di Python, vai a <your python env>\Lib\site-packages\django\core\management\commands\runserver.pye imposta 1. default_port = '<your_port>'
2. Trovalo sotto def handle e set
if not options.get('addrport'): self.addr = '0.0.0.0' self.port = self.default_port

Ora, se esegui "python manage.py runserver", verrà eseguito di default su "0.0.0.0:

Buon divertimento con la programmazione ...


3
La modifica dei sorgenti dei pacchetti dipendenti è considerata una cattiva pratica. Le modifiche possono essere perse durante l'aggiornamento / la reinstallazione.
arogachev

Esatto @arogachev, è solo un'opzione con cui puoi impostare la porta e l'host predefiniti. Ma non è davvero una buona pratica modificare i pacchetti dipendenti. puoi impostare l'IP e la porta anche quando esegui il tuo server nel prompt dei comandi.
Amrendra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.