2015-06-13 3 views
1

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

ответ

0

Возможно, вы используете это неправильно.

Предположим, что вам нужно выполнить какую-то конкретную задачу, скажите, отправьте письмо через 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) 

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

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

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

1

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

UPD:

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

Хорошо, это означает, что я не могу планировать задачи в самих моделях или представлениях. – Rohit

+1

@Rohit. Я думаю, вы можете оставить этот метод внутри 'models.py' (отдельный файл - это просто совет из документации), но как глобальная функция с' id 'как параметр вызвать параметры задачи хранятся в формате json в db, поэтому вы не можете передать свой объект, потому что он не может быть воспроизведен из json позже. – bellum

+0

когда я бегу питона manage.py process_tasks, я получаю эту ошибку: C: \ Python34 \ Lib \ сайт-пакеты \ background_task \ models.py: 28: RemovedInDjango18War нин: 'метод Manager.get_query_set' должен быть переименован 'get_queryset'. класс TaskManager (models.Manager): Неизвестная команда: 'process_tasks' Что мне здесь не хватает – Rohit

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^