Редактировать:
Я все еще не уверен, чего вы пытаетесь достичь, и есть некоторые важные проблемы, которые подчеркнули комментаторы. Во-первых, ошибка AppRegistryNotReady: Apps aren't loaded yet
действительно расстраивает, я ценю это. Я не уверен, как вы организовали свой проект, поэтому не могу предоставить точное решение. Это может быть способ, которым вы организовали свои файлы и откуда вы импортируете класс AppConfig вашего приложения. Поместили ли вы его или какие-либо пользовательские функции или классы в уровень пакета вашего приложения __init__.py
, чтобы вы могли импортировать оттуда? Если это так, это сбивает с толку Django, см. https://stackoverflow.com/a/34136825/2275482
Во-вторых:
Я пытаюсь вызвать функцию сразу после команды python manage.py runserver
Я думаю, что мы изо всех сил пытаемся понять, чего вы пытаетесь достичь, и не путаете ли вы, когда ваше приложение Django запускается с запуском сервера. Как отмечают комментаторы, веб-сервер полностью независим от Django; это отдельный процесс.
Даже тестовый сервер в комплекте с Django не зависит от вашего приложения Django. Это просто простой сервер разработки, помещенный туда для удобства, но он не требуется и не должен использоваться в производстве. Django построен в соответствии с PEP 333. Насколько я знаю, он будет работать с любым веб-сервером WSGI, совместимым с PEP 333, будь то Apache и mod_wsgi, gunicorn или uWSGI и т. д. и т. д. Если вы хотите, чтобы код выполнялся в отношении используемого вами сервера, вам нужно изучить этот документация по серверу.
manage.py
вроде django-admin
— это просто утилита, помогающая в разработке, см. https://docs.djangoproject.com/en/2.1/ref/django-admin/. Когда вы вызываете manage.py runserver
, вы вызываете утилиту, которая загружает ваше приложение и настраивает тестовый сервер. Вы можете увидеть поток выполнения, какие утилиты он импортирует и так далее в самом файле. Этот поток выполнения отличается от того, что произошло бы при использовании рабочего сервера.
Рабочий сервер, насколько мне известно, загружает ваше приложение django из корневого файла wsgi.py
. Он даже не смотрит на manage.py
Итак, это восходит к тому, пытаетесь ли вы опубликовать сообщение после запуска вашего сервера. В этом случае это не зависит от Django или когда запускается ваше приложение Django?
Если вы пытаетесь распечатать что-либо после запуска приложения django, его инициализации и загрузки на сервер, у вас есть несколько вариантов. Если вы действительно хотите, вы можете отредактировать и добавить manage.py
, но я бы не стал вмешиваться в ядро Django дальше этого. Это будет полностью проигнорировано при использовании другого производственного сервера.
Если вы хотите отредактировать точку входа, которая будет загружаться независимо от используемого сервера, вы можете отредактировать модуль wsgi.py
проекта или метод AppConfig отдельного приложения ready()
.
Если вы хотите создать что-то независимое от Django, которое постоянно работает в фоновом режиме, то, как указал @bruno-desthuilliers, вам нужно создать отдельный процесс либо как задание cron, либо с использованием сельдерея или даже django-моркови, если вы хотите, хотя последний все еще связан с запуском приложения, но может работать как отдельный воркер (я думаю). Django-морковь имеет только очень простые функции для небольших работ.
Извините, если это ничем не поможет, лучше всего я могу сделать с предоставленной информацией.
Я столкнулся с похожей проблемой, когда хотел что-то запустить внутри метода ready()
моих приложений AppConfig. Для меня это был способ, которым мое приложение было установлено в моей переменной настройки INSTALLED_APPS
.
Обычно вы регистрируете свои приложения следующим образом:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_app',
]
Однако это загрузит базовый класс AppConfig для регистрации ваших приложений. Если вы настраиваете и переопределяете AppConfig приложения, чтобы вы могли объявить свой собственный ready()
метод, который будет выполняться после создания экземпляра приложения, вам необходимо обратиться к переопределенному AppConfig непосредственно в INSTALLED_APPS
So
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_app.apps.MyAPPConfig', # MyAppConfig is the config class that inherits from AppConfig
]
В качестве альтернативы, если вы не хотите этого, сделайте это, когда конкретное приложение загружается через его AppConfig, поэтому не через метод ready()
, а буквально, когда проект загружается на сервер, вы можете поместить в свой проект модуль wsgi.py
после загрузки приложения
i.e
application = get_wsgi_application()
print('Hello World')
надеюсь, это поможет
person
alfandango
schedule
02.01.2019
python manage.py runserver x.x.x.x:yyyy
. проще не напишешь - person KyluAce   schedule 03.01.2019runserver
: вы знаете, что вы НЕ должны использовать сервер разработки в производстве, не так ли? - person bruno desthuilliers   schedule 03.01.2019