Django 신호 메커니즘 관련 설명 및 예

11109 단어
Django 신호 번호
django는 프레임워크의 서로 다른 위치에서 정보를 전달하는 데 도움을 주는 신호 메커니즘을 자체로 가지고 있다.즉, 어떤 사건이 발생할 때 신호 시스템은 한 개 이상의 발송자(senders)가 알림이나 신호(signals)를 한 그룹의 수용자(receivers)에게 보내는 것을 허용할 수 있다.
즉 관찰자 모드, 게시-구독(Publish/Subscribe)이라고도 부른다.어떤 동작이 발생할 때 신호를 보내고 이 신호를 감청하는 함수가 실행된다.
신호 시스템에는 다음 세 가지 요소가 포함됩니다.
  • 발신자 - 신호의 발신자
  • 신호 - 신호 자체
  • 수신자 - 신호 수신자
  • Django 내장 신호
  • Model signals
  • django.db.models.signals.pre_save Model
  • django.db.models.signals.post_save Model
  • django.db.models.signals.pre_delete Model
  • django.db.models.signals.post_delete Model
  • django.db.models.signals.pre_init Model __init__()
  • django.db.models.signals.post_init Model __init__()
  • django.core.signals.m2m_changed Model ManyToManyField

  • Management signals
  • django.core.signals.pre_migrate app (migrate)
  • django.core.signals.post_migrate app (migrate)

  • Request/response signals
  • django.core.signals.request_started Http
  • django.core.signals.request_finished Http
  • django.core.signals.got_request_exception

  • Test signals
  • setting_changedtest테스트를 사용하여 프로필을 수정할 때 자동으로 터치
  • template_renderedtest 테스트 렌더링 템플릿 사용 시 자동 트리거
  • Database Wrappers
  • connection_created 데이터베이스 연결 생성 시 자동 트리거

  • Django에 내장된 신호의 경우 지정된 신호만 등록하고 프로그램이 해당하는 작업을 수행할 때 자동으로 등록 함수를 터치합니다
    Copy
    def my_callback(sender, **kwargs):
        print("Request finished!")
    
    #    :
    from django.core.signals import request_finished
    
    request_finished.connect(my_callback)
    
    #    :
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")
    
    

    수신 신호 번호
    신호를 수신하려면 Signal.connect() 방법으로 수신기를 등록하세요.신호가 발송되면 이 수신기를 호출합니다.
    메소드 프로토타입:
    Copy
    Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)[source]

    매개변수:
    Copy
    receiver :           ,          。 
    sender :            。 
    weak :      
    dispatch_uid :           ,        。

    다음은 매번 HTTP 요청이 끝난 후 보내는 신호를 어떻게 수신하는지를 예로 들어 Django에 내장된 기성request_finished 신호에 연결한다.
    1. 수신기 작성
    수신기는 사실 Python 함수나 방법입니다.
    Copy
    def my_callback(sender, **kwargs):
        print("Request finished!")

    모든 수신기는 sender 매개 변수와 **kwargs 어댑터 매개 변수를 받아야 한다는 것을 주의하십시오.
    2. 수신기 연결 #
    수신기를 연결하는 두 가지 방법이 있는데 하나는 다음과 같은 수동 방식입니다.
    Copy
    from django.core.signals import request_finished
    
    request_finished.connect(my_callback)

    다른 하나는 receiver() 장식기 사용:
    Copy
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")

    3. 특정 발신자의 신호를 수신합니다#
    하나의 신호 수신기는 일반적으로 모든 신호를 수신할 필요가 없고 특정한 발송자가 보낸 신호만 수신할 수 있기 때문에sender 매개 변수에서 발송자를 지정해야 한다.다음 예제에서는 MyModel 모델의 인스턴스가 저장되기 전의 신호만 받습니다.
    Copy
    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

    4. 반복 신호 방지 #
    중복 신호를 방지하기 위해서 dispatch_uid 파라미터를 설정하여 수신기를 표시할 수 있습니다. 표지부호는 보통 문자열입니다. 아래와 같습니다.
    Copy
    from django.core.signals import request_finished
    
    request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")

    마지막 결과는 모든 유일한 dispatch_uid 값에 대해 수신기가 신호에 한 번만 연결되는 것이다.
    사용자 지정 신호 번호
    Django가 우리에게 제공하는 내장 신호(예를 들어 앞에서 열거한 것들)를 제외하고는 우리가 스스로 신호를 정의해야 할 때가 많다.
    클래스 원형: class Signal(providing args=list) [source]
    모든 신호는 django.dispatch.Signal의 실례이다.providing_args 매개 변수는 신호가 감청자에게 제공하는 매개 변수의 이름으로 구성된 목록이다.언제든지 providing_args 매개 변수 목록을 수정할 수 있습니다.
    새 신호는 다음과 같이 정의됩니다.
    Copy
    import django.dispatch
    
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

    위의 예는 pizza_done 신호를 정의하여 수용자에게size와 toppings 파라미터를 제공합니다.
    송신 번호
    Django에는 신호를 보내는 두 가지 방법이 있습니다.
    Copy
    Signal.send(sender, **kwargs)[source]
    
    
    Signal.send_robust(sender,** kwargs)[source] 

    sender 매개 변수 (대부분의 경우 클래스 이름) 를 제공해야 하며, 임의의 키워드 매개 변수를 제공할 수 있습니다.
    예를 들어, 이렇게 하면 앞의 pizza_done 신호를 보냅니다.
    Copy
    import django.dispatch
    
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
    
    class PizzaStore(object):
        ...
    
        def send_pizza(self, toppings, size):
            pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
            ...
    send()send_robust()는 수신기와 응답치 이원조의 목록을 되돌려줍니다.
    연결 끊기 신호 번호
    방법:
    Copy
    Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)[source]
    [(receiver, response), ... ] 신호를 끊는 수신기.Signal.disconnect()의 매개 변수와 같습니다.수신기가 성공적으로 분리되면 True로 돌아가고 그렇지 않으면 False로 돌아갑니다.
    신호 사용 인스턴스 #
    신호가 잘 이해되지 않을 수도 있습니다. 다음은 제가 Django에서 예를 하나 작성하여 시범을 보여 드리겠습니다.
    urls.py
    Copy
    from django.conf.urls import url
    from django.contrib import admin
    from signal_demo import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^signal/', views.signal_view),
    ]
    

    views.py
    Copy
    from django.dispatch import receiver, Signal
    from django.shortcuts import HttpResponse
    import time
    
    #      
    my_signal = Signal(providing_args=['path', 'time'])
    
    
    def signal_view(request):
        #      ,    
        res = my_signal.send(signal_view, path=request.path, time=time.strftime("%Y-%m-%d %H:%M:%S"))
        #           `[(receiver, response), ... ],                
        print(res)
        return HttpResponse('200,ok')
    
    
    @receiver(my_signal, sender=signal_view)
    def my_callback(sender, **kwargs):
        print("  %s      %s   ,  url %s" % (kwargs['time'], sender, kwargs["path"]))
        return 'ok'
    

    Django 서비스 시작
    방문http://127.0.0.1:8000/signal/
    console 인쇄
    Copy
    [XX] "GET /signal/ HTTP/1.1" 200 6
      XXX         ,  url /signal/
    [(, 'ok')]
    

    Django 신호 원리, 소스 분석 #
    관찰자 모드, 게시-구독(Publish/Subscribe)이라고도 부른다.어떤 동작이 발생할 때 신호를 보내고 이 신호를 감청하는 함수가 실행된다.
    DJango가 신호를 실현하는 원리는 리셋 함수, 직렬 실행
  • 송신자 송신
  • 신호 처리, 리셋 수신자
  • 수신자 처리
  • 신호 수신자의 반환값
  • 발송자가 신호를 받은 반환값(수신자의 반환값)
  • 참조 번호
  • 공식 문서
  • Django의 신호 메커니즘
  • 신호 시그널
  • Django의 신호
  • 좋은 웹페이지 즐겨찾기