美文网首页
Where to place signals

Where to place signals

作者: ccphantom | 来源:发表于2017-09-29 03:10 被阅读0次

    Strictly speaking, signal handling and registration code can live anywhere you like, although it’s recommended to avoid the application’s root module and its models module to minimize side-effects of importing code.
    In practice, signal handlers are usually defined in a signals submodule of the application they relate to. Signal receivers are connected in the ready() method of your application configuration class. If you’re using the receiver() decorator, simply import the signals submodule inside ready().
    Changed in Django 1.7: Since ready() didn’t exist in previous versions of Django, signal registration usually happened in the models module.

    Best practice is to define your handlers in ·handlers.py· in a signals submodule, e.g. a file that looks like:

    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
    

    The best place to register your signal handler is then in the AppConfig of the app that defines it, using the ready() method. This will look like this:

    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
    

    Make sure you're loading your AppConfig by specifying it either directly in your settings.py's INSTALLED_APPS, or in the __init__
    of your app. See see the ready() documentation for more information.
    Note: If you're providing signals for other apps to listen too as well, put them in the init
    in your signals module, e.g. a file that looks like:
    yourapp/signals/__init__.py

    import django.dispatch
    
    task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
    

    Another app can then listen to your signal by importing and registering it, e.g. from yourapp.signals import task_generate_pre_save. Separating your signals from your handlers keeps things clean.

    Instructions for Django 1.6:

    If you're still stuck on Django 1.6 or lower, then you'd do the same thing (define your handlers in yourapp/signals/handlers.py) but rather than using AppConfig, you would load the handlers via the init.py of your app, e.g. something like:

    yourapp/__init__.py

    import signals
    

    This isn't as nice as using the ready() method because it often causes circular import issues.

    相关文章

      网友评论

          本文标题:Where to place signals

          本文链接:https://www.haomeiwen.com/subject/wpebextx.html