Python Django pre_保存信号不工作

Python Django pre_保存信号不工作,python,django,django-signals,Python,Django,Django Signals,我用以下方法测试了Django的“pre_save”信号,但两种方法都无法捕获信号 美元 在manage.py shell中运行上述代码: 然后我运行我的网站,看到models.save()成功运行,但是回调函数没有运行 或者,我在shell上再次运行上述代码,然后在shell中运行models.save()。“save”再次运行良好,但回调函数仍然没有发生任何变化 最后,我将上述代码嵌入到一个\uuuu init\uuuu.py文件中,然后在网站上运行save()函数。但是,什么也没有发生 您

我用以下方法测试了Django的“pre_save”信号,但两种方法都无法捕获信号

美元

  • 在manage.py shell中运行上述代码: 然后我运行我的网站,看到models.save()成功运行,但是回调函数没有运行

  • 或者,我在shell上再次运行上述代码,然后在shell中运行models.save()。“save”再次运行良好,但回调函数仍然没有发生任何变化

  • 最后,我将上述代码嵌入到一个
    \uuuu init\uuuu.py
    文件中,然后在网站上运行save()函数。但是,什么也没有发生

  • 您能帮我找出为什么预存信号似乎不起作用吗?

    预存
    信号中所述,接受3个唯一参数(不是关键字参数),因此,您需要编辑
    我的回调
    函数,如下所示:

    def my_callback(sender,instance, using, **kwargs):
        logging.debug("======================================")
    

    您没有为一个设置sender类

    from django.db.models.signals import pre_save
    from myapp.models import MyModel
    import logging
    
    def my_callback(sender, **kwargs):
        logging.debug("======================================")
    pre_save.connect(my_callback, sender=MyModel)
    
    其次,如果您使用的是Django 1.3,那么应该使用新的decorator语法

    # Inside your models.py
    from django.db import models
    from django.db.models.signals import pre_save
    from django.dispatch import receiver
    
    class MyModel(models.Model):
        field1 = models.TextField()
        field2 = models.IntegerField()
    
    @receiver(pre_save, sender=MyModel)
    def mymodel_save_handler(sender, **kwargs):
        logging.debug("======================================")
    

    这应该可以做到,但我还没有测试代码,所以请告诉我代码是否仍然损坏。

    Eric的回答之所以能起作用,是因为他让您在models.py中连接了信号,因此当您通过网站保存模型时,信号处理程序与信号触发程序处于相同的过程中

    在示例1和3中,很容易看出它们不起作用的原因-您正在另一个过程(网站)中保存信号接收器正在侦听的位置

    我希望我能更好地理解为什么示例2也被破坏了,但我只是在自己的项目中调试了一个类似的问题,同时在shell中测试信号,这肯定与信号发送器和接收器不能“看到”彼此有关。

    logging.debug()
    正在使用根记录器,默认情况下,哪个处理程序级别是30(“警告”)

    =>
    logging.debug('something')
    根本不做任何事情(调试级别为10<30)。看

    应使用另一个自定义记录器执行相同的测试,或执行以下操作:

    l = logging.getLogger()
    l.setLevel(10)
    def my_callback(sender, **kwargs):
        logging.debug("======================================")
    pre_save.connect(my_callback)
    
    原始问题没有包含足够的信息,无法知道OP是否面临真正的问题(或部分问题)。

    但是OP的代码肯定不能与我的
    /manage.py shell

    配合使用。您是否尝试过将代码添加到
    models.py
    文件中?实际上,这些参数不是参数,而是存储在kwargs dict中的值。嗯,事实上是一样的。但是Django文档确实说信号接收器应该接受(sender,**kwargs),我想是为了将来的兼容性,而不是命名信号的特定参数。您不需要指定sender类,也不需要使用decorator语法。它不起作用的原因不是上述原因,而是因为他在另一个线程中将信号附加到发生保存的位置。请注意,要使@receiver代码起作用,您还需要从django.dispatch导入receiver,此代码仅在信号接收器与信号发射器位于同一model.py(model)中时有效。我不知道这是否是正确的解释,但它确实很有趣,值得批评或投票。但我不明白为什么它会是不同的线程或进程…它是不同的进程,因为一个是manage.py shell会话,另一个是manage.py runserver。。。这是相同的代码库,但它们是独立运行的,因此对shell中的对象(信号处理程序的连接)所做的更改不会影响web服务器中的等效对象(非常确定“进程”是正确的术语,而不是我在对Eric的答案的评论中使用的“线程”)。是的,我认为它适用于1,但如果是django应用程序init.py,则不是3(都不是2)。另外,这个
    logging.debug
    对我来说似乎非常可疑=>请参阅我的回答agree about 3,只要代码在web服务器中重新加载
    l = logging.getLogger()
    l.setLevel(10)
    def my_callback(sender, **kwargs):
        logging.debug("======================================")
    pre_save.connect(my_callback)