Настройка базового приемника сигналов в изолированном приложении

#django-oscar

#django-oscar

Вопрос:

Я пытаюсь настроить приемник сигналов в приложении «песочница». Я создал /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 I do import signals и I have /sandbox/signals/__init__.py , который делает import receivers это, я предполагаю, что он загружает этот модуль при запуске (это может быть неправильным предположением).

Когда я загружаю страницу продукта в браузере, я ничего не вижу в журнале консоли. Могу ли я просто неправильно настроить ведение журнала или это неправильный способ подключения приемников сигналов?

Ответ №1:

Документы Django рекомендуют импортировать ваши приемники сигналов изнутри ready() метода вашего класса конфигурации приложения. Вот пример того, как это делает сам Oscar.

Я подозреваю, что импорт приемника, в котором вы сейчас это делаете, вообще не будет работать — sandbox он не загружается как самостоятельный модуль, это просто каталог, в котором находятся другие модули.

В песочнице, поставляемой с Oscar, нет ни одного собственного приложения, к которому вы могли бы добавить это, поэтому вам нужно будет добавить его в apps каталог, а затем включить его в INSTALLED_APPS настройку.