django 1.8 공식 문서 번역:14-5 신호

7571 단어 django
시그널
Django는 신호가 프레임워크의 어느 곳에나 나타날 때 알림을 받을 수 있도록 하는 '신호의 배달기' 를 포함한다.간단하게 말하면 신호가 지정하는 을 허용한다송신기일련의 알림수신기,몇몇 조작이 이미 발생했다.일부 코드가 같은 사건에 흥미를 느낄 때 매우 도움이 될 것이다.
Django가 제공한일련의 내장 신호,사용자의 코드로 DJango의 특정 작업에 대한 알림을 받을 수 있습니다.여기에는 다음과 같은 유용한 알림이 포함됩니다.
  • django.db.models.signals.pre_save & django.db.models.signals.post_save
        [`save()`](../ref/models/instances.html#django.db.models.Model.save "django.db.models.Model.save")           。
    
  • django.db.models.signals.pre_delete & django.db.models.signals.post_delete
       [`delete()`](../ref/models/instances.html#django.db.models.Model.delete "django.db.models.Model.delete")       [`delete()`](../ref/models/querysets.html#django.db.models.query.QuerySet.delete "django.db.models.query.QuerySet.delete")            。
    
  • django.db.models.signals.m2m_changed
         [`ManyToManyField`](../ref/models/fields.html#django.db.models.ManyToManyField "django.db.models.ManyToManyField")      。
    
  • django.core.signals.request_started & django.core.signals.request_finished
    Django     HTTP      。
    

  • 전체 목록 및 각 신호에 대한 완전한 설명은내장 신호에 대한 문서.
    너도 너 자신의 사용자 정의 신호를 정의하고 발송할 수 있다.다음 문장을 보시오.
    감청 신호
    당신은 하나를 등록해야 합니다.수신기함수는 신호를 받습니다. 이 함수는 신호가 Signal.connect()로 전송될 때 호출됩니다.Signal. `connect`(_receiver_[, _sender=None_, _weak=True_, _dispatch_uid=None_])
    Parameters:
    * receiver – 이 신호와 연결된 리셋 함수입니다.상세하다수신기 함수. *sender - 신호를 받기 위해 특정한 송신기를 지정합니다.상세하다지정된 송신기에 의해 전송된 신호 연결. *weak – DJango는 일반적으로 약한 인용으로 신호를 저장하는 프로세서입니다.수신기가 국부 변수라면 쓰레기로 회수될 수도 있다는 얘기다.신호를 호출하는 connect() 방법은 이렇게 하는 것을 방지하기 위해 weak=False를 전달하는 것이다.*dispatch_uid - 신호 수신기의 유일한 표지부호로 신호가 여러 번 발송되는 것을 방지한다.상세하다중복 방지 신호.
    HTTP 요청이 끝날 때마다 호출되는 신호를 등록해서 어떻게 작동하는지 살펴봅시다.우리는 request_finished 신호에 연결할 것이다.
    수신기 함수
    우선, 우리는 수신기 함수를 정의해야 한다.수신기는 Python 함수 또는 메서드일 수 있습니다.
    def my_callback(sender, **kwargs):
        print("Request finished!")
    

    주의 함수 수락sender 함수와 어댑터 키워드 파라미터(**kwargs).모든 신호 처리기는 반드시 이 매개 변수를 받아들여야 한다.
    우리는 잠시 후에 송신기를 주목해서 지금 **kwargs 파라미터를 먼저 봅시다.모든 신호는 키워드 파라미터를 보내고 언제든지 키워드 파라미터를 수정할 수 있습니다.request_finished의 경우 매개 변수를 보내지 않는 것으로 기록됩니다. 이것은 my_callback(sender)처럼 우리의 신호 처리기를 작성해야 한다는 것을 의미합니다.
    이것은 잘못된 것이다--실제로 만약 네가 이렇게 한다면 Django는 이상을 던질 것이다.신호에 파라미터가 추가되면 수신기가 새로운 파라미터를 처리해야 하기 때문이다.
    연결 수신기 함수
    수신기를 신호에 연결할 수 있는 두 가지 방법이 있다.수동으로 연결하는 방법:
    from django.core.signals import request_finished
    
    request_finished.connect(my_callback)
    

    또는 receiver() 데코더를 사용하여 자동으로 연결합니다.receiver (_signal_)
    Parameters:
    signal – A signal or a list of signals to connect a function to.
    다음은 장식기를 사용하여 연결하는 방법입니다.
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")
    

    현재, 우리의 my_callback 함수는 요청이 끝날 때마다 호출됩니다.
    이 코드는 어디에 두어야 합니까?
    엄밀히 말하면 신호 처리와 등록된 코드는 당신이 원하는 곳에 두어야 하지만, 응용 프로그램의 루트 모듈과models 모듈에 두지 않도록 하여 도입 코드의 부작용을 최소화하는 것을 권장합니다.
    실제로 신호 처리는 응용과 관련된 signals 서브 모듈에 정의된다.신호 수신기는 설정 클래스의 ready() 방법으로 연결됩니다.하면, 만약, 만약...액receiver() 장식기, ready() 내부에서 signals 서브 모듈을 가져오면 됩니다.
    Changed in Django 1.7: ready()는 Django 이전 버전에 존재하지 않기 때문에 신호의 등록은 보통 models 모듈에서 진행된다.
    주의ready() 방법은 테스트 기간에 여러 번 실행되기 때문에 원할 수도 있습니다중복 방지 신호,특히 테스트에서 보낼 예정입니다.
    지정한 송신기에서 보내는 신호를 연결하다
    몇몇 신호는 여러 번 발송되지만, 너는 이 신호들의 확실한 서브집합만 수신하고 싶다.예를 들어 django.db.models.signals.pre_save 신호를 고려하면 모델이 저장되기 전에 발송된다.대다수 상황에서 너는 알 필요가 없다모든모형이 저장되는 시기 - 하나만 알면 됩니다.특정한모델이 저장되는 시기
    이러한 상황에서, 당신은 등록을 통해 특정 송신기만 보내는 신호를 받을 수 있다.django.db.models.signals.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):
        ...
    
    my_handler 함수는 MyModel 실례를 저장할 때만 호출됩니다.
    서로 다른 신호는 서로 다른 대상을 그들의 송신기로 사용한다.각 특정 신호의 세부 사항을 보셔야 합니다내장 신호에 대한 문서.
    중복 방지 신호
    일부 경우 수신자에게 신호를 보내는 코드가 여러 번 실행될 수 있다.이것은 수신기 함수를 여러 번 등록시키고 같은 신호 이벤트에 여러 번 호출합니다.
    만약 이러한 행위가 문제를 초래할 경우 (예를 들어 모델이 저장될 때 신호를 사용하여 메일을 보낼 때) 수신기 함수를 표시하는 유일한 표지부호를 dispatch_uid 매개 변수로 전달합니다.식별자는 보통 문자열입니다. 해시를 계산할 수 있는 대상은 모두 가능하지만.마지막 결과는 모든 유일한 dispatch_uid 값에 대해 수신기 함수는 신호에 한 번만 호출된다는 것이다.
    from django.core.signals import request_finished
    
    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"])
    

    이 코드는 pizza_done 신호를 설명하고 수신자에게 toppings 인자와 size 인자를 제공한다.
    매개 변수의 목록을 언제든지 수정할 수 있다는 것을 명심하십시오. 따라서 처음 시도할 때 API를 완전히 확정할 필요가 없습니다.
    신호를 보내다
    Django에는 신호를 보내는 두 가지 방법이 있습니다.Signal. `send`(_sender_, _**kwargs_) Signal. `send_robust`(_sender_, _**kwargs_) Signal.send() 또는 Signal.send_robust()를 호출하여 신호를 보내다.sender 인자를 제공해야 하며, 가능한 한 많은 키워드 인자를 제공해야 한다.
    예를 들어, 이렇게 해서 우리의 pizza_done 신호를 보낸다.
    class PizzaStore(object):
        ...
    
        def send_pizza(self, toppings, size):
            pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
            ...
    
    send()send_robust()는 이원조를 포함하는 목록[(receiver, response), ... ]을 되돌려줍니다. 이것은 호출된 수신기 함수와 그들의 응답 값을 대표합니다.send()send_robust()는 수신기 함수에서 발생하는 이상을 처리할 때 다르다.send() _할 줄 모르다수신기에서 발생하는 모든 이상을 포착하다.그것은 간단하게 잘못을 위로 전달할 것이다.그래서 오류가 발생하면 모든 수신기가 알림을 받는 것은 아니다.send_robust() 파이톤Exception류에서 계승된 모든 이상을 포획하고 모든 수신기가 신호에 대한 통지를 받을 수 있도록 한다.오류가 발생하면 오류가 발생한 수신기의 이원조에서 오류가 발생합니다.
    New in Django 1.8: send_robust()를 호출할 때 되돌아오는 오류 __traceback__ 속성에traceback이 있습니다.
    인터럽트 시그널Signal. `disconnect`([_receiver=None_, _sender=None_, _weak=True_, _dispatch_uid=None_])
    신호를 끊는 수신기 Signal.disconnect() 를 호출합니다.Signal.connect()에 모든 매개 변수가 설명되어 있습니다.수신기가 성공적으로 끊겼으면 되돌아오기True, 그렇지 않으면 되돌아오기False.receiver 매개 변수는 끊을 등록된 수신기를 나타낸다.dispatch_uid가 수신기를 정의하는 데 사용되면 None일 수 있습니다.
    Changed in Django 1.8:
    반환되는 부울 값이 추가되었습니다.
    번역자: Django 문서 공동 번역 팀, 원문: Signals.
    본고는 CC BY-NC-SA 3.0 프로토콜로 발표되었으며 전재는 작가의 서명과 글의 출처를 보존해 주십시오.
    Django 문서 협동 번역팀은 일손이 부족해서 관심 있는 친구가 우리에 가입할 수 있습니다. 완전 공익적입니다.교류군: 467338606.

    좋은 웹페이지 즐겨찾기