django изменить порт сервера запуска по умолчанию


131

Я хотел бы сделать порт по умолчанию, который manage.py runserverслушает, определяемым посторонним config.ini. Есть ли что-то более простое решение, чем разбор sys.argvвнутри manage.pyи вставка настроенного порта?

Цель состоит в том, чтобы запускаться ./manage.py runserverбез необходимости каждый раз указывать адрес и порт, но заставляя его принимать аргументы из config.ini.


Если вы запустите команду из истории командной строки, нажатий клавиш станет еще меньше. Например, для меня это «<ctrl-r> запускает <enter>», и он автоматически запускает ту же команду, что и в прошлый раз, поэтому включен порт и т.д.
Джонатан Хартли,

Ответы:


177

создайте сценарий bash со следующим:

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

сохраните его как runserver в том же каталоге, что и manage.py

chmod +x runserver

и запустите его как

./runserver

Либо так, либо я подумываю добавить собственную команду управления.
Джонни

Вы не можете запустить сервер разработки программно, поэтому пользовательская команда не будет работать, если она не вызовет оболочку, используя что-то вроде call. Если это решение работает для вас, обязательно отметьте его как решенное.
Пабло Альборнос

На самом деле я начал использовать supervisorдля этого сейчас, что упрощает управление. :-) Но ваше, вероятно, самое чистое решение, кроме написания специального runserverскрипта.
Джонни

Supervisor - хорошее решение, потому что я бы не рекомендовал запускать среду разработки. Вы теряете, среди прочего, преимущество вывода сервера на терминал. Если вы действительно хотите использовать супервизор, я бы посоветовал использовать его с полнофункциональным сервером WSGI, таким как Gunicorn. Пожалуйста, не запускайте сервер разработки в качестве рабочего сервера ...
Пабло Альборнос

Это полезно, но не очень удобно при одновременном манипулировании несколькими проектами - я бы принял ответ ниже, в котором указывается порт, который будет использоваться для каждого отдельного проекта. Просто мое мнение.

105

На самом деле самый простой способ изменить (только) порт в разработке сервера Django выглядит так:

python manage.py runserver 7000

который должен запускать сервер разработки на http://127.0.0.1:7000/


2
Этот ответ касается изменения порта, а не порта по умолчанию.
Physicalattraction

42

Начиная с Django 1.9, самое простое решение, которое я нашел (на основе решения Квентина Стаффорда-Фрейзера), - это добавить несколько строк, в manage.pyкоторые динамически изменяют номер порта по умолчанию перед вызовом runserverкоманды:

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)

Хотя он не дает точного ответа на исходный вопрос и отступы испорчены (код должен быть с отступом от «import django» вниз), я предпочитаю этот ответ, потому что он полностью самодостаточен и не требует изменения введенного в командной строке.
PurpleDiane

1
@PurpleDiane Отступы исправлены.
Flimm

Мой manage.py на самом деле не выглядит так, я думаю, с тех пор Django изменился
NaturalBornCamper

6
В настоящее время (начиная с from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080версии 2.0.3) вы можете просто добавить: в свой manage.py. Вы также можете изменить адрес прослушивания с помощью:runserver.default_addr
Варгас

30

Все следующие команды позволяют изменить порт во время работы django:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000

1
«Наша цель - запустить ./manage.py runserver без необходимости каждый раз указывать адрес и порт»
JuSTMOnIcAjUSTmONiCAJusTMoNICa

11

Создайте подкласс django.core.management.commands.runserver.Commandи перезапишите default_portчлен. Сохраните файл как собственную команду управления, например в <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

Я загружаю здесь настройки формы порта по умолчанию (которые, в свою очередь, читают другие файлы конфигурации), но вы также можете напрямую прочитать их из другого файла.


Это кажется лучшим решением, однако мой Django 1.8.14 не распознает созданный мной файл runserver.py. Где-то прописать?
Physicalattraction

@physicalattraction Вероятно, ваш файл находится не в нужном месте. docs.djangoproject.com/en/2.0/howto/custom-management-commands начинается с описания того, где разместить модуль python для runserverкоманды. Также, возможно, у вас есть другое приложение, также регистрирующее команду с именем runserver. Попробуйте переименовать свою команду и посмотрите, распознается ли она.
Feuermurmel

1
Вставляю <app_name>/management/commands/runserver.py, но потом используется оригинал Django runserver. Когда я переименовываю его в run_server.py, он распознается. Я не вижу ничего особенного runserverна странице, на которую вы ссылаетесь.
Physicalattraction

Дело в том, что он staticfilesделает именно то, что вы предлагаете . Таким образом, следование вашим инструкциям нарушает работу статических файлов в разработке. Лучше всего импортировать из django.contrib.staticfiles.management.commands.
x-

8

Мы создали новую команду управления runserver, которая представляет собой тонкую оболочку стандартной, но меняет порт по умолчанию. Грубо говоря, вы создаете management/commands/runserver.pyи вставляете что-то вроде этого:

# 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

В Pycharm вы можете просто добавить порт в параметры

введите описание изображения здесь


1

Я очень опаздываю на вечеринку, но если вы используете IDE, такую ​​как PyCharm, в меню «Выполнить» («Выполнить»> «Изменить конфигурации») есть опция «Изменить конфигурации», где вы можете указать порт по умолчанию. Это, конечно, актуально, только если вы отлаживаете / тестируете через PyCharm.


1

Если вы хотите изменить конфигурации по умолчанию, выполните следующие действия:

  1. Открыть команду типа терминала

     $ /usr/local/lib/python<2/3>.x/dist-packages/django/core/management/commands
  2. Теперь откройте файл runserver.py в редакторе nano как суперпользователь.

     $ sudo nano runserver.py
  3. найдите переменную default_port, тогда вы увидите, что номер порта по умолчанию - 8000. Теперь вы можете изменить его на все, что захотите.

  4. Теперь выйдите и сохраните файл, используя «CTRL + X и Y, чтобы сохранить файл».

Примечание. Замените <2/3> .x используемой версией python.


0
  1. Создайте переменную окружения в вашем .bashrc

    экспорт RUNSERVER_PORT = 8010

  2. Создать псевдоним

    псевдоним runserver = 'django-admin runserver $ RUNSERVER_PORT'

Я использую оболочку zsh и virtualenvs. Я помещаю экспорт в проекты postactivate script и назначаю порт для каждого проекта.

workon someproject
runserver

-2

Это старый пост, но для тех, кому интересно:

Если вы хотите изменить номер порта по умолчанию, чтобы при запуске команды "runserver" вы начинали с предпочитаемого порта, сделайте следующее:

  1. Найдите свою установку Python. (у вас может быть установлено несколько питонов, и у вас также может быть версия виртуальной среды, поэтому убедитесь, что вы нашли правильный)
  2. Внутри папки python найдите папку site-packages. Внутри вы найдете свою установку django
  3. Откройте папку django -> ядро ​​-> управление -> команды
  4. Внутри папки команд откройте скрипт runserver.py в текстовом редакторе.
  5. Найдите поле DEFAULT_PORT. по умолчанию он равен 8000. Измените его на то, что вам нравится DEFAULT_PORT = "8080"
  6. Перезагрузите сервер: python manage.py runserver и убедитесь, что он использует ваш установленный номер порта.

Он работает с python 2.7, но должен работать и с более новыми версиями python. Удачи


11
Это худшее предложение из всех здесь. IMHO, редактирование файла из дистрибутива никогда не является хорошей идеей и приводит к путанице, потому что изменение не отслеживается VCS и легко перезаписывается.
Feuermurmel

Не рекомендуется редактировать модуль Django в пакетах сайта. Может быть обновлен до новой версии. Также это влияет на все приложения Django.
Сатинду Кавнет

-3

Я боролся с той же проблемой и нашел одно решение. Думаю, это может тебе помочь. при запуске python manage.py runserverон будет принимать 127.0.0.1 в качестве IP-адреса по умолчанию и 8000 в качестве номера порта по умолчанию, который можно настроить в вашей среде python. В настройках python перейдите <your python env>\Lib\site-packages\django\core\management\commands\runserver.pyи установите 1. default_port = '<your_port>'
2. найдите это под дескриптором def и установите
if not options.get('addrport'): self.addr = '0.0.0.0' self.port = self.default_port

Теперь, если вы запустите «python manage.py runserver», он по умолчанию будет работать на «0.0.0.0:

Наслаждайтесь кодированием .....


3
Изменение источников зависимых пакетов считается плохой практикой. Изменения могут быть потеряны при обновлении / переустановке.
арогачев 01

Правильно @arogachev, это просто опция, с помощью которой вы можете сделать порт и хост по умолчанию. Но на самом деле изменять зависимые пакеты не рекомендуется. вы также можете установить IP-адрес и порт при запуске сервера в командной строке.
Амрендра
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.