Django 신호 메커니즘 관련 설명 및 예
django는 프레임워크의 서로 다른 위치에서 정보를 전달하는 데 도움을 주는 신호 메커니즘을 자체로 가지고 있다.즉, 어떤 사건이 발생할 때 신호 시스템은 한 개 이상의 발송자(senders)가 알림이나 신호(signals)를 한 그룹의 수용자(receivers)에게 보내는 것을 허용할 수 있다.
즉 관찰자 모드, 게시-구독(Publish/Subscribe)이라고도 부른다.어떤 동작이 발생할 때 신호를 보내고 이 신호를 감청하는 함수가 실행된다.
신호 시스템에는 다음 세 가지 요소가 포함됩니다.
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
django.core.signals.pre_migrate app (migrate)
django.core.signals.post_migrate app (migrate)
django.core.signals.request_started Http
django.core.signals.request_finished Http
django.core.signals.got_request_exception
setting_changed
test테스트를 사용하여 프로필을 수정할 때 자동으로 터치template_rendered
test 테스트 렌더링 템플릿 사용 시 자동 트리거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가 신호를 실현하는 원리는 리셋 함수, 직렬 실행
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.