Acabei de começar a implementar ouvintes de sinal em um projeto de django. Enquanto eu entendo o que são e como usá-los. Estou tendo dificuldade para descobrir onde devo colocá-los. A documentação do site django tem o seguinte a dizer:
Você pode colocar código de manuseio e registro de sinal onde quiser. No entanto, você precisará garantir que o módulo em que ele está seja importado desde o início, para que o tratamento do sinal seja registrado antes que qualquer sinal precise ser enviado. Isso torna o models.py do seu aplicativo um bom local para registrar os manipuladores de sinal.
Embora seja uma boa sugestão, ter classes ou métodos não modelados em meus models.py apenas me atrapalha.
Então, qual é a melhor prática / regra para armazenar e registrar manipuladores de sinal?
fonte
Foo
qual faça partefooapp
. Mas o receptor de sinal é uma extensão e vive em um aplicativo diferente (por exemplootherapp
).Isso foi adicionado à documentação quando o Django 1.7 foi lançado:
A melhor prática é definir seus manipuladores em handlers.py em um submódulo de sinais, por exemplo, um arquivo parecido com:
yourapp / signs / handlers.py :
O melhor lugar para registrar seu manipulador de sinal é o AppConfig do aplicativo que o define, usando o método ready () . Isso ficará assim:
yourapp / apps.py :
Verifique se você está carregando o AppConfig, especificando-o diretamente em INSTALLED_APPS do settings.py ou no
__init__
aplicativo. Veja a documentação ready () para mais informações.Nota: Se você estiver fornecendo sinais para outros aplicativos também ouvirem, coloque-os
__init__
no módulo de sinais, por exemplo, um arquivo parecido com:yourapp / signs / __ init__.py
Outro aplicativo pode ouvir seu sinal importando e registrando-o, por exemplo
from yourapp.signals import task_generate_pre_save
. Separar os sinais dos manipuladores mantém as coisas limpas.Instruções para o Django 1.6:
Se você ainda está preso no Django 1.6 ou inferior, faça o mesmo (defina seus manipuladores em yourapp / signs / handlers.py), mas em vez de usar o AppConfig, carregue os manipuladores através do __init__.py de seu aplicativo, por exemplo, algo como:
yourapp / __ init__.py
Isso não é tão bom quanto usar o método ready () porque geralmente causa problemas de importação circular.
fonte
__init__
sinais de importação não funcionaria para mim, então me pergunto se há outro lugar para importar sinais de até que estejamos prontos para atualizar para uma versão posterior do django.from . import handlers
(ou similar)yourapp/signals/__init__.py
?yourproject.
na última linha do bloco de código da classe TaskConfig. Eu tenho esse trabalho com exatamente essa estrutura, por isso considero este qa :)Acabei de descobrir isso e, como meus sinais não são relacionados ao modelo, pensei em adicionar minha solução.
Estou registrando vários dados em torno de login / logout e necessário conectar
django.contrib.auth.signals
.Coloquei os manipuladores de sinal em um
signals.py
arquivo e depois importei os sinais do__init__.py
arquivo do módulo, pois acredito que isso é chamado assim que o aplicativo é iniciado (o teste com umaprint
instrução sugere que ele seja chamado antes mesmo de o arquivo de configurações ser lido).e em signs.py
Eu sou bem novo no Django (/ python), então estou aberto a qualquer um que me diga que essa é uma péssima idéia!
fonte
user_logged_in.connect(on_logged_in)
provavelmente deve estar passando nodispatch_uid
argumento. Mais em docs.djangoproject.com/en/dev/topics/signals/… .Recentemente, li este artigo sobre as práticas recomendadas no que diz respeito ao layout de seus projetos / aplicativos e sugere que todos os seus sinais personalizados do despachante devem ir em um arquivo chamado
signals.py
. No entanto, isso não resolve completamente o seu problema, pois você ainda precisa importá-los para algum lugar, e quanto mais cedo eles forem importados, melhor.A sugestão do modelo é boa. Como você já definiu tudo no seu
signals.py
arquivo, não deve demorar mais do que uma linha na parte superior do arquivo. É semelhante à maneira como oadmin.py
arquivo é organizado (com definições de classe na parte superior e o código para registrar todas as classes administrativas personalizadas na parte inferior), se você definir seus sinais, conecte-os no mesmo arquivo.Espero que ajude! Em última análise, tudo se resume ao que você prefere.
fonte
signals.py
arquivo, mas não sabia como deveria ser chamado depois. Ao importá-lo no meumodels.py
arquivo, obtive uma solução muito limpa, sem "poluir" meu arquivo models.py. Obrigado! :)models.py e signs.py em cada aplicativo foram os locais recomendados para conectar sinais; no entanto, eles não são a melhor solução, na minha opinião, para manter os sinais e manipuladores enviados. O envio deve ser a razão pela qual os sinais e manipuladores inventados no django.
Eu estava lutando por um longo tempo e finalmente descobrimos a solução.
crie um módulo de conector na pasta do aplicativo
então nós temos:
em app / connectors.py, definimos manipuladores de sinais e os conectamos. Um exemplo é fornecido:
depois, em models.py, adicionamos a seguinte linha no final do arquivo:
Tudo feito aqui.
Dessa forma, podemos colocar sinais em signs.py e todos os manipuladores em connectors.py. Sem bagunça nos modelos e sinais.
Espero que ele forneça outra solução.
fonte
Eu os mantenho em um arquivo separado
signals.py
,models.py
depois que todos os modelos estiverem definidos. Eu os importo e conecto modelos a sinais.signs.py
models.py
Isso me fornece uma separação lógica, é claro que não há nada errado em mantê-los em models.py , mas é mais gerenciável dessa maneira.
Espero que isto ajude!!
fonte
Pequeno lembrete sobre
AppConfig
. Não se esqueça de definir:fonte