как использовать 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 для планирования задачи или сослаться на некоторые существующие документы?
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:
- Вам не нужно запускать
process_tasksс помощью crontab, потому что эта команда внутренне спит каждые 5 секунд (это значение настраивается), а затем снова проверяет, есть ли какая-либо задача для запуска.- ваша задача выглядит странно. Вы должны объявить его как глобальную функцию в отдельном файле и передать
idмодели внутри него, получить объект поidсделать вычисления и сохраните ваш объект.
Comments