2015-06-13 40 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

您應按照here所述運行python manage.py process_tasks。您可以將其添加到crontab中以定期執行。

UPD:

  1. 你不需要使用crontab的原因此命令內部睡每5秒(此值可配置),然後再次檢查是否有運行任何任務運行process_tasks
  2. 你的任務看起來很奇怪。你應該在單獨的文件中聲明它爲全局函數,並在其中通過id模型,通過id獲取對象做計算並保存你的對象。
+0

好吧,這意味着我不能在模型或視圖本身中安排任務 – Rohit

+1

@Rohit我認爲你可以在'models.py'(單獨的文件僅僅是來自文檔的建議)內部保留這個方法,但是作爲具有'id '作爲參數導致任務參數以db的json格式存儲,所以你不能傳遞你的對象,因爲它以後不能再從json中重現。 – bellum

+0

當我運行python manage.py process_tasks,我得到這個錯誤: C:\ Python34 \ LIB \站點包\ background_task \ models.py:28:RemovedInDjango18War 寧:'Manager.get_query_set'方法應該改名 'get_queryset'。 類任務管理器(models.Manager): 未知命令: 'process_tasks' 我是什麼在這裏失蹤 – Rohit

1

django-background-task和django-background-task s是有區別的。 django-background-task沒有維護,與新的Django版本不兼容。我們不久前更新並擴展了它的新功能,並保留了新的向後兼容軟件包django-background-task s on Github。新的django-background-tasks應用程序可以從PyPI下載或安裝。