как использовать django-background-задачи



Я делаю приложение django. Чтобы рассчитать ранг каналов на основе строк и комментариев, я пытаюсь использовать django-background-tasks. функция, которую я использую в моделях узлов:



    @background(schedule=60)
def get_score(self):
p = self.likes+self.comments # popularity
t = (now()-self.date).total_seconds()/3600 # age_in_hrs
# last_activity =
n = self.admin_score
score = (p/pow((t+1), 1.2))*n
self.score = score
return score


, но я не вижу никаких изменений в результат. Это означает, что я делаю это правильно и упускаю основную концепцию. Может ли кто-нибудь сказать мне, как использовать django-background-tasks для планирования задачи или сослаться на некоторые существующие документы?

647   3  

3 ответов:

Вы, кажется, используете его неправильно.

Предположим, вы должны выполнить какую-то конкретную задачу, например, отправить письмо через 5 минут после регистрации пользователя. Итак, что вы делаете:

Создайте задачу с помощью django-background-task.

@background(schedule=60*5)
def send_html_mail_post(id, template):
    u = User.objects.get(id=id)
    user_email = u.email
    subject = "anything"
    html_content = template.format(arguments)
    from_email, to = from_email, user_email
    text_content = ''
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

Декоратор в верхней части определяет, через какое время вызова функции произойдет фактическое событие.

Позвоните ему, когда он вам понадобится.

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        up = UserProfile.objects.create(user=instance)
        up.save()
        tasks.send_welcome_email(up.user.id, template=template)

Это создает задачу и сохраняет ее в базе данных, а также хранение в db время, когда он будет выполнен.

То, что вы хотите сделать, делая что-то через регулярные промежутки времени, что может быть легче сделано путем создания задания cron.

То, что вы делаете, это создаете функцию, как вы показали в вопросе. А затем определите задание cron, чтобы вызывать его каждые 5 минут или с любым интервалом, который вы хотите.

Существует разница между django-background-task и django-background-tasks. django-background-task не поддерживалась и была несовместима с новыми версиями Django. Мы обновили и расширили его новыми функциями некоторое время назад и сохранили новый обратно совместимый пакет django-background-tasks на Github. Новое приложение django-background-tasks можно загрузить или установить из PyPI.

Вы должны запустить python manage.py process_tasks, как описано здесь. Вы можете добавить его в crontab для периодического выполнения.

UPD:

  1. Вам не нужно запускать process_tasks с помощью crontab, потому что эта команда внутренне спит каждые 5 секунд (это значение настраивается), а затем снова проверяет, есть ли какая-либо задача для запуска.
  2. ваша задача выглядит странно. Вы должны объявить его как глобальную функцию в отдельном файле и передать id модели внутри него, получить объект по id сделать вычисления и сохраните ваш объект.

Comments

    Ничего не найдено.