SORU
27 NİSAN 2010, Salı


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:

Where should this code live?

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
7 NİSAN 2014, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006