7

これで、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をどのように実行できるかということです。多分私は完全に間違った道を進んでいて、これはまったく不可能です。したがって、ブラウザでUI通知を実行するために、セロリのcronジョブを使用できるかどうかという疑問が残ります。

4

2 に答える 2

7

Django メッセージ フレームワークを使用することはできません。タスクはユーザーのリクエストにアクセスする方法がなく、リクエスト オブジェクトをワーカーに渡すこともできないためです。

しかし、間違いなくdjango-notifications のようなものを使用できます。タスクで通知を作成し、問題のユーザーに添付できます。次に、これらのメッセージをビューから取得し、テンプレートで好きなように処理できます。ユーザーは、次のリクエストで通知を確認します (または、リアルタイムっぽい通知には AJAX ポーリングを使用するか、リアルタイムにはHTML5 Websocketを使用できます [ django-websocketを参照])。

于 2012-11-30T17:50:49.233 に答える
4

はい、可能ですが簡単ではありません。サーバーからクライアントへの通信を実行/エミュレートする方法:

ポーリング 最も簡単な方法は、javascript からサーバーをポーリングすることです。セロリタスクは/updates、新しい更新をチェックし、行を既読としてマークして返すようなURLでフェッチできる行をデータベースに作成できます。

long polling しばしばコメットと呼ばれます。クライアントは、サーバーが何かを返すことを決定するまで保留中のサーバーに要求を行います。たとえば、django-cometを参照してください。

websocket サーバーからクライアントへの真の通信を有効にするには、クライアントからサーバーへのオープン接続が必要です。django-socketiodjango-websocketは、これを可能にする再利用可能なアプリの例です。

あなたの質問の文脈から判断すると、私のアドバイスは次のとおりです。基本的なポーリングを行うか、メールに固執してください。

于 2012-11-30T17:51:45.603 に答える