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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.