Nerede sinyal işleyicileri django bir proje.
Sadece django projesinde sinyal dinleyicileri uygulamaya başladım. Onlar ne olduğunu ve onları nasıl kullanacağını anlıyorum. Zor bir zaman onları nereye koymam gerektiğini çözemedim ben. Django sitesinden belgeleri, bu demek vardır:
Sinyal işleme ve koyabilirsiniz kayıt kodu her yerde senin gibi. Ancak, emin olmak gerekir Bu modül erken alınan alır sinyal işleme alır bunu herhangi bir sinyal gerekiyor önce kayıtlı gönderilecektir. Bu uygulamanızın yapar modelleri.py koymak için iyi bir yer sinyal işleyicileri kayıt.
Onun iyi bir öneri olsa da, benim models.py model sınıfları veya yöntemleri sigara olması beni sinir ediyor.
O halde, ne en iyi uygulama ve sinyal işleyicileri kayıt saklamak için bir kural var mı?)
CEVAP
Bu documentation eklediDjango 1.7piyasaya sürüldü:
Açık konuşmak gerekirse, sinyal işleme ve kayıt kodu uygulamanın kök modülü önlemek için tavsiye olsa da senin gibi her yerde yaşayabilir ve modelleri kod alma yan etkileri en aza indirmek için modülü.
Uygulamada, sinyal işleyicileri genellikle ilgili uygulamanın sinyalleri bir submodule olarak tanımlanır. Alıcılar hazır bağlı sinyal() uygulama yapılandırma sınıfı yöntemi. Eğer alıcı kullanıyorsanız() dekoratör, sadece hazır içine sinyalleri submodule alma().
Django 1.7 değişti: hazır olduğundan) Django önceki sürümlerde yoktu, kayıt genellikle modeller modülünde oldu sinyal.
En iyi uygulama, örneğin gibi görünen bir dosya: sinyaller bir submodule olarak handlers.py senin işleyicileri tanımlar
yourapp/signals/handlers.py:
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
Sinyal kaydetmek için en iyi yer işleyici tanımlar bu uygulama AppConfig, kullanıyor() hazıryöntem. Bu gibi görünecektir:
yourapp/apps.py:
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers #noqa
Yapmak ya da yeni bir settings.py's İNSTALLED_APPS veya uygulamanızın __init__
. belirterek AppConfig yüklediğinizden emin Daha fazla bilgi için see the ready() documentation bkz.
Not:Eğer diğer uygulamalar için sinyalleri çok iyi dinle veriyorsanız, örneğin gibi görünen bir dosya: __init__
sinyal modülü koydum
yourapp/signals/__init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Başka bir uygulama daha sonra, örneğin from yourapp.signals import task_generate_pre_save
ithalatçı tarafından kayıt sinyali dinleyebilirsiniz. Amirlerinden sinyalleri ayıran şey temiz tutar.
Django 1.6 için talimatlar:
Eğer aklın hala Django 1.6 ya da daha düşük, o zaman sen de olsan aynısını yapardın (define işleyicileri içinde yourapp/signals/handlers.py ama yerine kullanarak AppConfig, olur yük işleyicileri) __init__.py senin app, örneğin gibi bir şey
yourapp/__init__.py
import signals
Bu hazır kullanmak kadar güzel bir şey değil mi() genellikle dairesel alma sorunları nedeniyle yöntemi.
Django: "proje" vs "app...
Nerede'in gelen Django benim iste...
Nerede hata nginx, ağ herhangi bir işl...
Model yöneticisi nesneleri Django.oluş...
Django tabanlı proje A/B testi hakkınd...