> 백엔드 개발 > 파이썬 튜토리얼 > Django의 관찰자 패턴에 대한 자세한 설명

Django의 관찰자 패턴에 대한 자세한 설명

Y2J
풀어 주다: 2017-05-13 13:47:00
원래의
1948명이 탐색했습니다.

Django에서는 프레임워크가 작업을 수행할 때 분리를 위해 "신호 전달"이 제공됩니다. 일반인의 관점에서 신호를 사용하면 특정 발신자가 특정 작업이 발생할 때 일부 수신자에게 경고할 수 있습니다.

Django는 신호 메커니즘을 제공합니다. 실제로 이는 게시-구독(Publish/Subscribe)이라고도 하는 관찰자 패턴입니다. 어떤 작업이 발생하면 신호가 방출되고 신호를 듣는 함수가 실행됩니다.

Django에는 다음과 같은 몇 가지 신호가 내장되어 있습니다.


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.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送
로그인 후 복사

우리가 해야 할 일은 수신자 기능을 등록하는 것입니다. 예를 들어, 각 요청이 완료된 후 한 줄을 인쇄하려는 경우입니다.

은 콜백을 사용하여 등록할 수 있습니다.


# receiver
def my_callback(sender, **kwargs):
  print("Request finished!")
 
# connect
from django.core.signalsimport request_finished
 
request_finished.connect(my_callback)
로그인 후 복사

는 데코레이터를 사용하여 등록할 수도 있습니다. 다음 코드는 위와 완전히 동일합니다.


from django.core.signalsimport request_finished
from django.dispatchimport receiver
 
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")
로그인 후 복사

receiver콜백 기능sender를 사용하는 것 외에도 pre_save 기능과 같은 다른 매개변수를 사용할 수도 있습니다.

sender: sender(pre_save인 경우 모델 클래스)
instance: 인스턴스
raw
using
update_fields
post_save()는 일부 연결을 지원할 수 있는 보다 실용적인 함수입니다. 업데이트. 매번 뷰에 작성하는 대신. 예: 사용자가 환불 신청서를 제출하는 경우 주문의 상태 를 "환불됨" 상태로 변경해야 합니다. 어디에서나 수정하지 않고도 신호 메커니즘을 사용할 수 있습니다.


@receiver(post_save, sender=RefundForm)
deforder_state_update(sender, instance, created, **kwargs):
  instance.order.state = REFUNDING
  instance.order.save() # 这里,order是refundform的一个外键
로그인 후 복사

물론 여기에는 환불 주문 취소, 상태 다시 변경 등 점점 더 포괄적인 내용을 작성할 수 있습니다.

Observer는 매우 실용적인 디자인 패턴입니다. Django는 사용자 정의 신호도 지원합니다.

【관련 추천사항】

1. 특별 추천: "php Programmer Toolbox" V0.1 버전 다운로드

2. Python 무료 동영상 튜토리얼

3. Python 객체 지향 동영상 튜토리얼

위 내용은 Django의 관찰자 패턴에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿