2012-11-30 57 views
4

我現在已經成功地建立Django的芹菜後,我現有的任務,檢查通過電子郵件提醒用戶當任務是由於:Django/Celery中的定期任務 - 如何在屏幕上通知用戶?

@periodic_task(run_every=datetime.timedelta(minutes=1)) 
def check_for_tasks():  
    tasks = mdls.Task.objects.all() 
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00) 
    for task in tasks: 
     if task.reminder_date_time == now: 
      sendmail(...) 

到目前爲止好,但如果我想也顯示彈出給用戶作爲提醒?

Twitter的引導允許創建彈出窗口和JavaScript中顯示它們:

$(this).modal('show'); 

的問題是,雖然,如何才能芹菜工人守護進程運行在用戶的瀏覽器這個JavaScript?也許我會完全錯誤的方式,這是不可能的。因此問題仍然可以用芹菜cronjob來實現瀏覽器上的ui通知?

回答

6

那麼,您不能使用Django messages framework,因爲任務無法訪問用戶的請求,也無法將請求對象傳遞給工作人員,因爲它們是不可取的。

但你絕對可以使用類似django-notifications的東西。您可以在任務中創建通知並將其附加到相關用戶。然後,您可以從視圖中檢索這些消息,並根據自己的喜好在模板中處理它們。用戶會在他們的下一個請求中看到通知(或者您可以使用AJAX輪詢實時通知或HTML5 websockets實時實時[請參閱django-websocket])。

+0

+1 for django-notifications –

+0

感謝您的支持。 django-websocket起初聽起來像一個很好的解決方案。但是,一旦我讀到他們的免責聲明,聽起來令人沮喪。我想我可以嘗試每5分鐘進行一次Ajax輪詢,如果它不太瘋狂。或者,如果用戶在下一次請求中看到該消息,則應該足夠好。如果他們沒有在屏幕上工作(比如在午餐時間),那麼ajax調查彈出窗口無助於提醒他們。所以也許後者是結合電子郵件通知的最佳解決方案。儘管文檔看起來並不多,但我試圖深入探討django-notifications。 :) – Houman

3

是的,這是可能的,但並不容易。如何做/仿真服務器到客戶端的通信:

polling 最簡單的方法是從javascript輪詢服務器。你的芹菜任務可以在你的數據庫中創建一些行,可以通過像/updates這樣的url來獲取,它會檢查新的更新,將這些行標記爲已讀並返回它們。

長輪詢 通常被稱爲彗星。客戶端向服務器發出一個請求,直到服務器決定返回一些東西。例如,請參見django-comet

websocket 要啓用真正的服務器到客戶端通信,您需要從客戶端到服務器的打開連接。 django-socketiodjango-websocket是使這成爲可能的可重用應用程序的示例。

我的建議是根據你的問題的背景來判斷:或者做一些基本的投票,或者堅持使用電子郵件。