Python 백엔드에서 알아야 할 Django의 신호 메커니즘을 3분 동안 알아봅시다!

3214 단어
콘셉트
django는 프레임워크의 서로 다른 위치에서 정보를 전달하는 데 도움을 주는 신호 메커니즘을 자체로 가지고 있다.즉, 어떤 사건이 발생할 때 신호 시스템은 한 개 이상의 발송자(senders)가 알림이나 신호(signals)를 한 그룹의 수용자(receivers)에게 보내는 것을 허용할 수 있다.
(Qt의 신호와 슬롯 메커니즘 같다)
신호 시스템에는 다음 세 가지 요소가 포함됩니다.
  • 발신자 - 신호의 발신자
  • 신호 - 신호 자체
  • 수신자 - 신호 수신자
  • Django에는 일반적으로 사용되는 다양한 신호가 내장되어 있습니다.
    ORM 모형의 save () 방법이 호출되기 전이나 이후에 신호를 보내다
    django.db.models.signals.pre_save
    django.db.models.signals.post_save
    

    ORM 모델이나 조회 집합의 delete() 방법이 호출되기 전이나 이후에 신호를 보냅니다.
    django.db.models.signals.pre_delete
    django.db.models.signals.post_delete
    

    다중 필드가 수정되었을 때 신호를 보냅니다.
    django.db.models.signals.m2m_changed
    

    HTTP 요청을 수신하고 닫을 때 신호를 보냅니다.
    django.core.signals.request_started
    django.core.signals.request_finished
    

    이것은 매우 편리하다. 이런 상황을 상상해 보자. 우리는 제3자의 Django 라이브러리를 도입했다. 그는 모델을 만들 것이다. 우리는 그의 코드를 수정하지 않은 상황에서 그가 모델을 만들 때 다른 표의 데이터를 동시에 수정하고 싶다. 그러면 이때 신호 메커니즘이 쓸모가 있을 것이다.
    간단한 사용 예
    신호 감청은 두 가지 방식이 있는데 하나는 Signal.connect() 방법이고 하나는 장식기이다.
    Signal.connect () 방법
    메소드 프로토타입:
    Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)[source]
    

    매개변수:
  • receiver: 현재 신호 연결의 리셋 함수, 즉 신호를 처리하는 함수입니다.
  • sender: 어느 송신자로부터 신호를 받는지 지정합니다.
  • weak: 약한 인용 여부
  • dispatch_uid: 신호 수신기의 유일한 표식부호로 신호가 여러 번 발송되지 않도록 합니다.

  • 장식기법
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")
    
    receiversender 파라미터를 추가하여 어떤 모델이 생성한 신호를 받는지 선별할 수 있다. 예를 들어 다음과 같다.
    from django.db.models import signals
    from django.dispatch import receiver
    
    @receiver(signals.post_save, sender=MyModel)
    def demo_callback(sender: MyModel, instance: MyModel, **kwargs):
        pass
    

    전송된 모델 대상을 읽으려면 반드시 instance 파라미터를 사용해야 합니다. sender!sender 한 장르예요!
    dispatch 설정uid 매개 변수 중복 방지 신호
    중복 신호를 방지하기 위해 디스패치를 설정할 수 있습니다uid 매개 변수는 수신기를 표시합니다. 식별자는 보통 문자열입니다. 아래와 같습니다.
    from django.core.signals import request_finished
    
    request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")
    

    인터럽트 시그널
    어떤 조건을 만족시키면 우리는 더 이상 감청 신호를 필요로 하지 않고 신호를 끊을 수 있다.
    Signal.disconnect () 는 신호를 끊는 수신기에 사용됩니다.Signal과 함께 제공됩니다.connect () 의 매개 변수가 같습니다.수신기가 성공적으로 분리되면 True로 돌아가고 그렇지 않으면 False로 돌아갑니다.
    Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)[source]
    

    후기
    요즘 막 입사한 프로젝트가 너무 바쁘고 신기술도 많이 배웠어요. 그런데 블로그 한 편을 잘 쓸 시간이 너무 없는 것 같아요. 본문이라도 짧은 시간에 맞추는 게 정말 어려워요. 주말에 최근의 기술 노트를 잘 정리해야 해요.
    Django 신호 메커니즘에 대한 더 많은 내용(사용자 정의 신호 등)은 공식 문서를 참고할 수 있다.https://docs.djangoproject.com/en/3.0/topics/signals/
    PS: 다음에는 Django Admin 방안에 대한 조사 연구, emm, 그리고 위챗 애플릿의 로그인, 결제 접속에 관한 글을 쓸 것입니다. 그리 어려운 것은 아니지만 처음 사용하면 곳곳에 구덩이가 가득합니다.
    환영하다
    저는 일련의 기술 문장과 자료를 정리하여 공중번호'프로그래밍실험실'백엔드에서 linux,flutter,c#,netcore,android,java,python 등 관련 기술 문장과 자료를 얻을 수 있고 문제가 있으면 공중번호 백엔드에 메시지를 남길 수 있습니다.

    좋은 웹페이지 즐겨찾기