django cambia el puerto predeterminado del servidor de ejecución

129

Me gustaría que el puerto predeterminado que manage.py runserverescucha en especificable en un extraño config.ini. ¿Hay una solución más fácil que analizar sys.argvdentromanage.py e insertar el puerto configurado?

El objetivo es ejecutar ./manage.py runserversin tener que especificar la dirección y el puerto cada vez, sino que tome los argumentos del config.ini.

jonny
fuente
Si ejecuta el comando desde el historial de la línea de comando, entonces es aún menos pulsaciones de teclas. Por ejemplo, para mí es "<ctrl-r> ejecuta <enter>", y ejecuta automáticamente el mismo comando que la última vez, por lo que se incluye el puerto, etc.
Jonathan Hartley

Respuestas:

176

cree un script bash con lo siguiente:

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

guárdelo como servidor de ejecución en el mismo directorio que manage.py

chmod +x runserver

y ejecutarlo como

./runserver
Pablo Albornoz
fuente
O eso, o estoy pensando en agregar un comando de administración personalizado.
jonny
No puede ejecutar el servidor de desarrollo mediante programación, por lo que un comando personalizado no funcionará a menos que llame al shell usando algo como call. Si esta solución funciona para usted, asegúrese de marcarla como resuelta.
Pablo Albornoz
De hecho, comencé a usar supervisoresto ahora, lo que hace que sea aún más fácil de administrar. :-) Pero la tuya es probablemente la solución más limpia además de escribir un runserverscript dedicado .
jonny
Supervisor es una buena solución porque no lo recomendaría para ejecutar el entorno de desarrollo. Pierde la ventaja de tener la salida del servidor en el terminal, entre otras cosas. Si realmente quiere usar un supervisor, mi consejo sería usarlo con un servidor WSGI con todas las funciones como Gunicorn. No ejecute el servidor de desarrollo como su servidor de producción ...
Pablo Albornoz
Esto es útil pero no excelente cuando se hacen malabares con varios proyectos a la vez: habría aceptado la siguiente respuesta que especifica el puerto que se utilizará para cada proyecto distinto. Solo mi opinión aunque.
105

En realidad, la forma más fácil de cambiar (solo) el puerto en el servidor Django de desarrollo es como:

python manage.py runserver 7000

que debería ejecutar el servidor de desarrollo en http://127.0.0.1:7000/

Qback
fuente
2
Esta respuesta se trata de cambiar el puerto, no cambiar el puerto predeterminado.
physicalattraction
42

A partir de Django 1.9, la solución más simple que he encontrado (basada en la solución de Quentin Stafford-Fraser) es agregar algunas líneas para manage.pymodificar dinámicamente el número de puerto predeterminado antes de invocar el 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)
BillyBBone
fuente
Aunque no responde exactamente a la pregunta original, y la sangría está desordenada (el código debe estar sangrado de "import django" hacia abajo), prefiero esta respuesta porque es completamente autónoma y no requiere cambiar lo que se ingresó en la línea de comando.
PurpleDiane
1
@PurpleDiane La sangría es fija.
Flimm
Mi manage.py realmente no se ve así, supongo que Django cambió desde
NaturalBornCamper
66
Actualmente (a partir de 2.0.3) puede agregar: from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080a su manage.py. También puede cambiar la dirección de escucha con:runserver.default_addr
Vargas
29

Todos los siguientes comandos son posibles para cambiar el puerto mientras se ejecuta django:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000
Krishnamoorthy Acharya
fuente
1
"El objetivo es ejecutar ./manage.py runserver sin tener que especificar la dirección y el puerto cada vez"
criptych está con Monica el
11

Cree una subclase de django.core.management.commands.runserver.Commandy sobrescriba el default_portmiembro. Guarde el archivo como un comando de administración propio, por ejemplo, en <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

Estoy cargando la configuración predeterminada del formulario de puerto aquí (que a su vez lee otros archivos de configuración), pero también podría leerlo directamente desde otro archivo.

Feuermurmel
fuente
Esta parece ser la mejor solución, sin embargo, mi Django 1.8.14 no reconoce mi archivo creado por mí mismo runserver.py. ¿Debo registrarlo en alguna parte?
physicalattraction
@physicalattraction Su archivo probablemente no está en la ubicación correcta. docs.djangoproject.com/en/2.0/howto/custom-management-commands comienza con una descripción de dónde colocar el módulo de Python para el runservercomando. Además, quizás tenga otra aplicación que también registre un comando llamado runserver. Intente cambiar el nombre de su comando y ver si se reconoce.
Feuermurmel
1
Lo puse <app_name>/management/commands/runserver.py, pero luego runserverse usa el original de Django . Cuando le cambio el nombre run_server.py, se reconoce. No veo nada especial runserveren la página a la que enlazas.
physicalattraction
La cosa es staticfilesexactamente lo que sugieres . Por lo tanto, seguir sus instrucciones deja de servir archivos estáticos en desarrollo. Es mejor importar desde django.contrib.staticfiles.management.commands.
x-yuri
8

Creamos un nuevo comando de administración 'runserver' que es una envoltura delgada alrededor del estándar pero cambia el puerto predeterminado. Aproximadamente, creas management/commands/runserver.pyy pones algo como esto:

# 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
Quentin Stafford-Fraser
fuente
2

En Pycharm puedes simplemente agregar el puerto a los parámetros

ingrese la descripción de la imagen aquí

chaggy
fuente
1

Llego muy tarde a la fiesta aquí, pero si usa un IDE como PyCharm, hay una opción en 'Editar configuraciones' en el menú 'Ejecutar' (Ejecutar> Editar configuraciones) donde puede especificar un puerto predeterminado. Por supuesto, esto solo es relevante si está depurando / probando a través de PyCharm.

Smitty
fuente
1

Si desea cambiar las configuraciones predeterminadas, siga estos pasos:

  1. Comando tipo terminal abierto

     $ /usr/local/lib/python<2/3>.x/dist-packages/django/core/management/commands
  2. Ahora abra el archivo runserver.py en nano editor como superusuario

     $ sudo nano runserver.py
  3. busque la variable 'default_port' y verá que el número de puerto predeterminado es '8000'. Ahora puedes cambiarlo a lo que quieras.

  4. Ahora salga y guarde el archivo usando "CTRL + X e Y para guardar el archivo"

Nota: Reemplace <2/3> .x con su versión utilizable de python

rhoitjadhav
fuente
0
  1. Cree una variable de entorno en su .bashrc

    exportar RUNSERVER_PORT = 8010

  2. Crear alias

    alias runserver = 'django-admin runserver $ RUNSERVER_PORT'

Estoy usando zsh y virtualenvs wrapper. Pongo exportar en proyectos postactivate script y asign port para cada proyecto.

workon someproject
runserver
Pavel1114
fuente
-2

Esta es una publicación antigua pero para aquellos que estén interesados:

Si desea cambiar el número de puerto predeterminado, cuando ejecute el comando "runserver", comience con su puerto preferido, haga lo siguiente:

  1. Encuentra tu instalación de Python. (puede tener varias pitones instaladas y también puede tener su versión de entorno virtual, así que asegúrese de encontrar la correcta)
  2. Dentro de la carpeta de Python localice la carpeta de paquetes del sitio. Dentro de eso encontrarás tu instalación de django
  3. Abra la carpeta django-> núcleo -> administración -> comandos
  4. Dentro de la carpeta de comandos, abra el script runserver.py con un editor de texto
  5. Encuentra el campo DEFAULT_PORT. es igual a 8000 por defecto. Cámbialo a lo que quieras DEFAULT_PORT = "8080"
  6. Reinicie su servidor: python manage.py runserver y vea que usa su número de puerto establecido

Funciona con python 2.7, pero también debería funcionar con versiones más recientes de python. Buena suerte

Daniel Kiss
fuente
11
Esta es la peor sugerencia de todas aquí. En mi humilde opinión, editar un archivo de una distribución nunca es una buena idea y genera confusión porque el cambio no es rastreado por un VCS y se sobrescribe fácilmente.
Feuermurmel
No se recomienda editar el módulo Django en los paquetes del sitio. Se puede actualizar con una nueva versión. También afecta a todas las aplicaciones de Django.
Sathindu Kavneth
-3

Estaba luchando con el mismo problema y encontré una solución. Supongo que puede ayudarte. cuando ejecute python manage.py runserver, tomará 127.0.0.1 como dirección IP predeterminada y 8000 como número de puerto predeterminado que se puede configurar en su entorno python. En su configuración de Python, vaya <your python env>\Lib\site-packages\django\core\management\commands\runserver.pyy establezca 1. default_port = '<your_port>'
2. encuentre esto en el controlador def y configure
if not options.get('addrport'): self.addr = '0.0.0.0' self.port = self.default_port

Ahora, si ejecuta "python manage.py runserver", se ejecutará de forma predeterminada en "0.0.0.0:

Disfruta codificando .....

Amrendra
fuente
3
Modificar las fuentes de paquetes dependientes se considera una mala práctica. Se pueden perder cambios en la actualización / reinstalación.
arogachev 01 de
Así es @arogachev, es solo una opción por la cual puedes hacer un puerto y host predeterminados. Pero realmente no es una buena práctica modificar paquetes dependientes. también puede configurar la IP y el puerto cuando ejecuta su servidor en el símbolo del sistema.
Amrendra