2016-05-25 3 views
3

Django 1.9.Переопределение AppConfig.ready()

Попытка узнать сигналы. В документации для AppConfig.ready() говорится, что «Подклассы могут переопределять этот метод для выполнения задач инициализации, таких как регистрация сигналов». (https://docs.djangoproject.com/en/1.9/ref/applications/#django.apps.AppConfig.ready).

some_app/apps.py

class SomeAppConfig(AppConfig): 
    name = 'some_app' 

    def ready(self): 
     print("Redefined ready method in some_app") 

demo_signals/settings.py

INSTALLED_APPS = [ 
    ... 
    "some_app.apps.SomeAppConfig", 
] 

python manage.py runserver 
Redefined ready method in some_app 
Redefined ready method in some_app 
Performing system checks... 

System check identified no issues (0 silenced). 
May 25, 2016 - 15:15:58 
Django version 1.9.6, using settings 'demo_signals.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 

Пожалуйста, обратите внимание, что "Redefined готовый метод в some_app" печатается дважды.

Не могли бы вы помочь мне понять, почему это называется дважды. И это не моя ошибка, почему два вызова необходимы для регистрации сигналов?

+2

Вероятно, сервер DEV начинает два отдельных потока. Что произойдет, если вы начнете с '-nothreading'? –

+0

@ Daniel Roseman, попробовал. Опять дважды. – Michael

+0

@ Даниэль Роземан, я только что начал совершенно новый проект. Дважды снова. Nothreading не помогает. – Michael

ответ

7

При использовании python manage.py runserver Django запустить два процесса, один для фактического сервера разработки и другой, чтобы перезагрузить приложение, когда изменение кода

Вы можете проверить его импорта os внутри AppConfig класса и распечатать идентификатор процесса внутри ready функция следующим образом:

import os 

class SomeAppConfig(AppConfig): 
    name = 'some_app' 

    def ready(self): 
     print(os.getpid()) 

Вы увидите, что он печатает два различных процесса

Вы можете также S терпкий сервер без опции перезагрузки, и вы будете видеть только один процесс работает (и ваш код print("Redefined ready method in some_app") будет выполняться только один раз):

python manage.py runserver --noreload 
+0

Большое спасибо. – Michael

Смежные вопросы