首页 > 解决方案 > 在沙盒应用程序中设置基本信号接收器

问题描述

我正在尝试在沙盒应用程序中设置信号接收器。我/sandbox/signals/receivers.py使用以下代码创建:

import logging

from django.dispatch import receiver
from oscar.apps.catalogue.signals import product_viewed


@receiver(product_viewed)
def receive_product_view(sender, product, user, **kwargs):
    logging.info("receive_product_view")
    if user and user.is_authenticated:
        logging.info("Product {product} viewed by user {user}")
    else:
        logging.info("Product {product} viewed anonymously")

这似乎没有任何作用。在/sandbox/__init__.py我这样做import signals并且我有/sandbox/signals/__init__.pywhich 这样做import receivers所以我假设它在启动时加载该模块(这可能是一个错误的假设)。

当我在浏览器中加载产品页面时,我在控制台日志中看不到任何内容。我可能只是记录设置错误,或者这是连接信号接收器的错误方式吗?

标签: django-oscar

解决方案


Django 文档建议您从ready() 应用程序配置类的方法中导入信号接收器。这是奥斯卡本身如何做到这一点的一个例子

我怀疑在你当前正在做的地方导入接收器根本不起作用——sandbox它本身并没有作为模块加载,它只是一个包含其他模块的目录。

Oscar 附带的沙盒没有任何您可以添加的应用程序 - 因此您需要将其添加到apps目录中,然后将其包含在INSTALLED_APPS设置中。


推荐阅读