Maison >développement back-end >Tutoriel Python >Explication détaillée du modèle d'observateur dans Django

Explication détaillée du modèle d'observateur dans Django

Y2J
Y2Joriginal
2017-05-13 13:47:001944parcourir

"Envoi du signal" est fourni dans Django pour le découplage lorsque le framework effectue des opérations. En termes simples, un signal permet à un expéditeur spécifique d'alerter certains destinataires lorsqu'une action se produit.

Django fournit un mécanisme de signalisation. En fait, il s’agit du modèle observateur, également appelé publication-abonnement (Publish/Subscribe). Lorsqu'une action se produit, un signal est émis, puis la fonction qui écoute le signal sera exécutée.

Django a des signaux intégrés, tels que :


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请求时发送

Ce que nous devons faire est d'enregistrer une fonction de récepteur. Par exemple, si vous souhaitez imprimer une ligne une fois chaque demande terminée.

peut être enregistré à l'aide d'un rappel :


# receiver
def my_callback(sender, **kwargs):
  print("Request finished!")
 
# connect
from django.core.signalsimport request_finished
 
request_finished.connect(my_callback)

peut également être enregistré à l'aide d'un décorateur. Le code suivant est tout à fait équivalent à celui ci-dessus.


from django.core.signalsimport request_finished
from django.dispatchimport receiver
 
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

récepteurFonction de rappel En plus d'utiliser l'expéditeur, vous pouvez également utiliser d'autres paramètres, comme pour la fonction pre_save :

sender : sender (s'il s'agit de pre_save, c'est une classe de modèle)
instance : instance
raw
using
update_fields
post_save() est une fonction plus pratique qui peut prendre en charge quelques liens Mise à jour. Au lieu de nous demander de l'écrire dans la vue à chaque fois. Par exemple : si un utilisateur soumet une demande de remboursement, nous devons modifier le statut de la commande en statut "Remboursé". Vous pouvez utiliser le mécanisme de signalisation sans avoir à le modifier partout.


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

Bien sûr, vous pouvez écrire ici des choses de plus en plus complètes, comme annuler la commande de remboursement et modifier le statut.

Observer est un modèle de conception très pratique, et Django aide également les utilisateurs à personnaliser certains signaux.

【Recommandations associées】

1. Recommandation spéciale : Téléchargement de la version V0.1 de "php Programmer Toolbox"

2. Tutoriel vidéo gratuit Python

3 Tutoriel vidéo orienté objet Python

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn