Временами требуется запускать некий код при старте проекта. Пишите код, засовываете его в __init__.py
приложения и запускаете ./manage.py runserver
и видите, что код вызывается дважды. Начинается паника, изучение Google и StackOverflow.
Всё дело в том, что локальный сервер Django, который вы используете в процессе разработки проекта, имеет внутри себя функционал автозагрузки изменённых модулей. Этот функционал автоматически перезапускает Django сразу после сохранения вами изменений, внесённых в код. Для этого сервер запускает дополнительный процесс, работа которого и приводит к повторному выполнению кода. Практически то же самое происходит и при запуске тестов, это, кстати, описано в документации (см. там примечание).
Это нормально, если внимательно прочитать эту таску, то видно, что код внутри __init__.py
должен создаваться так, чтобы он не зависел от количества его запусков.
Можно отключать возможность автоматической перезагрузки кода:
./manage.py runserver --noreload
но это неправильно.
Решением будет являться примерно такой код (утащен со stackoverflow.com):
class MyAppConfig(AppConfig):
name = 'src.myapp'
run_already = False
def ready(self):
if not self.run_already:
print('Hello, world!')
self.run_already = True
Небольшая фича: атрибут name
класса AppConfig
должен совпадать со именем приложения, которое указано в INSTALLED_APPS
, т.е.:
INSTALLED_APPS = [
...
'src.myapp'
...
]
Обновлено 12 Июль 2016, 15:04 RaD.