23:django 신호(signal)

5576 단어 django
django는'신호 분배기'를 포함하여 일부 동작이 프레임의 다른 곳에서 발생할 때 결합 해제의 응용을 알릴 수 있도록 한다.통속적으로 말하면 일부 동작이 발생할 때 신호는 특정한 발송자가 일부 수용자를 일깨워 주는 것을 허용한다. 이것은 특히 유용한 디자인이다. 왜냐하면 일부 코드는 특정한 사건에 대해 특히 흥미를 가지기 때문이다. 예를 들어 동작을 삭제하는 것이다.
이를 위해django는 내장된 신호를 많이 제공했다. 예를 들어 자주 사용하는 기능(django.db.models.signal 디렉터리에 있는 몇 개의 신호를 예로 들면):
  • save:pre_save 및 postsave
  • delete:pre_delete 및 postdelete
  • change:m2m_changed

  • 더 많은 것을 알고 싶으면django의 내장 신호 문서를 보십시오. 이 절의 마지막 부분에도 모든 내장 신호의 간략한 소개가 있습니다.
    감청 신호
    신호를 받아들이려면, 신호가Signal에 의해 수신기 함수를 등록해야 한다.connect () 방법이 발사될 때 이 함수는 호출됩니다
    Signal.connect(receiver[,sender=None,weak=True,dispatch_uid=None])
    매개변수 설명:
  • receiver: 이 신호에 연결된 리셋 함수
  • sender: 신호의 발송자
  • weak: 약한 인용인지 여부, 기본값은 진짜입니다.따라서 수신기가 로컬 함수라면 쓰레기 회수로 간주됩니다. 원하지 않으면 connect () 방법을 사용할 때 weak=False
  • 를 사용하십시오.
  • dispatch_uid: 신호 수신기에 유일한 표지부호를 주고 중복된 신호가 발송되지 않도록 한다
  • 다음은 구체적인 예로 이 매개 변수를 설명해 봅시다. 이 예는 Requestfinished 신호(HTTP 요청이 끝날 때마다 호출됨):
    리셋 함수receiver
    콜백 함수는 수신기를 다음과 같이 정의할 수 있는 함수 또는 방법일 수 있습니다.
    def my_callback(sender, **kwargs):
    
        print "Request finished!"

     
    모든 신호 처리기는 이 두 개의 인자를 필요로 합니다:sender와 **kwargs.모든 신호는 키워드 파라미터를 보내기 때문에 처리할 때 파라미터가 없을 수도 있지만 처리하는 과정(당신이 쓴 처리 함수 이전)에 어떤 파라미터가 생성된 것을 의미하지 않습니다. **kwargs 파라미터가 전송되지 않으면 문제가 발생할 수 있습니다.이러한 고려를 바탕으로 이 두 매개 변수는 모두 필수적이다.
    receiver 리셋 함수에 연결
    두 가지 방법으로 신호와 수신기를 연결할 수 있다.
    connect 방법
    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!"

     
    이렇게 설정하면 HTTP가 받아들일 때마다 이 수신기 리셋 함수를 호출합니다
    특정 발송자 귀속
    위에 적어 놓으면 매번 호출하면 짜증나지 않을까요?나 같으면 짜증났을 거야. 왜냐하면 나는 모든 사람의 신호를 받아들이고 싶지 않으니까sender 키워드 파라미터를 설정해야 돼.
    두 번째 지식: 모든 종류의 신호는 특정한 발송자에 대응하기 때문에 발송자를 귀속시키려면 대응하는 발송자 유형을 귀속시켜야 한다. 예를 들어 Requestfinished는 handler class에 대응하고presave 대응 모델 클래스
    다음은 pre-save를 예로 삼아 특정한 발송자(모델)를 연결합니다.
    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):

    중복 방지 신호
    dispatch 사용uid 키워드 매개 변수
    request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")

     
    신호를 어떻게 감청하는지 말했으니 계속해서 정의와 발송 신호를 설명해 드리겠습니다.]
    정의 신호
    class Signal([providing_args=list])
    모든 신호는django입니다.dispatch.Signal의 인스턴스, providing 매개변수args는 신호가 감청기에 제공하는 매개 변수 이름의 목록입니다. 예를 들어:
    import django.dispatch
    
    
    
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

     
    이 코드는 피자 를 정의했다done의 신호, 매개 변수는 toppings와size
    신호를 보내다
    신호를 보내는 두 가지 방법이 있어요.
    Signal.send(sender,**kwargs)
    Signal.send_robust(sender,**kwargs)
    sender 매개 변수는 필수입니다. 키워드 매개 변수는 선택할 수 있습니다.
    class PizzaStore(object):
    
        ...
    
    
    
        def send_pizza(self, toppings, size):
    
            pizza_done.send(sender=self, toppings=toppings, size=size)

     
    이 두 가지 방법은 모두 하나의 원조를 되돌려줍니다. [(receiver,respose)...]호출된receiver 리셋 함수와 그들의response를 대표하는 목록
    이 두 가지 방법의 차이점은send가 어떠한 이상도 포착하지 않고 (잘못된 전파를 방치하고) sendrobust는 모든 이상을 포착하고 모든 수신기가 이 신호를 알고 있는지 확인합니다. (오류가 발생하면 오류 실체와 오류가 발생한 수신기가 하나의 원조로 그 목록에 되돌아옵니다.)
    인터럽트 시그널
    Signal.disconnect([receiver=None,sender=None,weak=True,dispatch_uid=None)
    수신 신호와 유사
    receiver 매개 변수는 그 수신기가 끊겼음을 표시하는 데 사용됩니다.dispatchuid의 경우 receiver는 None
    총괄적으로 말하면django가 자체로 가지고 있는 신호를 사용할 수도 있고 자신의 신호를 사용자 정의할 수도 있다. 신호는connect,send도disconnect 등등이 가능하다.

    좋은 웹페이지 즐겨찾기