zoukankan      html  css  js  c++  java
  • Django-Signals信号量

    信号量作为Django的一个核心知识点,在项目中很少有使用到,所以很多人都不了解或者没听过过(包括我)。简单来说就是在进行一些操作的前后我们可以发出一个信号来获得特定的操作,这些操作包括(信息来自:https://yiyibooks.cn/xx/Djang...

    • django.db.models.signals.pre_save&django.db.models.signals.post_save

      在模型 save()方法调用之前或之后发送。

    • django.db.models.signals.pre_delete&django.db.models.signals.post_delete

      在模型delete()方法或查询集的delete() 方法调用之前或之后发送。

    • django.db.models.signals.m2m_changed

      模型上的 ManyToManyField 修改时发送。

    • django.core.signals.request_started&django.core.signals.request_finished

      Django开始或完成HTTP请求时发送。

    其他细致的知识点,大家可以点链接查看,直接通过一个例子解释:

    • 在自定义用户模型类的时候,在后台添加用户数据因为使用了自定义模型类的create所以密码会以明文保存,接下来使用信号量方式在保存后马上修改密码解决。(网上一个项目的例子)

    users/signals.py

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    from django.contrib.auth import get_user_model
    User = get_user_model()
    
    
    # post_save:上面七大方法之一:在模型保存之后的操作
    # sender: 发出信号的model
    @receiver(post_save, sender=User)
    def create_user(sender, instance=None, created=False, **kwargs):
        """
        sender:模型类。
        instance:保存的实际实例。
        created:如果创建了新记录True。
        update_fields:Model.save()要更新的字段集,如果没有传递则为None
        """
        if created:
            password = instance.password
            # instance相当于user
            instance.set_password(password)
            instance.save()
    users/apps.py
    from django.apps import AppConfig
    
    
    class UsersConfig(AppConfig):
        name = 'users'
        verbose_name = '用户管理'
    
        def ready(self):
        """使用ready加载,否则不生效"""
            import users.signals
    request_started和request_finished实例
    # -*- coding:utf-8 -*-
    
    from django.core.signals import request_started, request_finished
    from django.http import HttpResponse
    from rest_framework.response import Response
    
    def request_started_handler(sender, **kwargs):
        print('start request')
    
    def request_finished_handler(sender, **kwargs):
        print('finish request')
    
    def signal_test(requsts):
        request_started.connect(request_started_handler)
        print('i am signal test')
        request_finished.connect(request_finished_handler)
        return Response('ok')
    
    
  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/276815076/p/10400122.html
Copyright © 2011-2022 走看看