2011-09-11 25 views
14

は、私が使用します。ジャンゴ・セロリプログレスバー

  1. セロリ
  2. ジャンゴ・セロリ
  3. RabbitMQの
私は現時点では、Djangoの管理ページ内のすべての私の仕事を見ることができます

  • 受信済み
  • のようなわずかな州があります。 REVOKED
  • RETRY
  • SUCCESS
  • は、それが私のために十分な情報ではありません

PENDING

  • FAILURE
  • を開始しました。実行中のプロセスの詳細を管理ページに追加することは可能ですか? プログレスバーのようなまたは終了したジョブは、カウンターなど

    私はセロリのロギング機能を使用する方法を知っているが、GUIは、いくつかの理由から、私の場合は良いです。

    したがって、トレース情報をDjango-Celeryの管理ページに送信できますか?

  • 答えて

    8

    私はこれを自分自身で理解しようとしています。 Celery userguideで説明した通りにPROGRESS状態を定義することから始めて、必要なのは、プログレスバーを更新するテンプレートにjsを挿入することだけです。

    28

    私の最小限の進捗状況を報告するDjangoバックエンドは、セットアップを使用しています。私はまだDjango n00bですが、これはセロリを使いこなすのは初めてですから、これはおそらく最適化されるでしょう。

    from time import sleep 
    
    from celery import task, current_task 
    from celery.result import AsyncResult 
    
    from django.http import HttpResponse, HttpResponseRedirect 
    from django.core.urlresolvers import reverse 
    from django.utils import simplejson as json 
    from django.conf.urls import patterns, url 
    
    
    @task() 
    def do_work(): 
        """ Get some rest, asynchronously, and update the state all the time """ 
        for i in range(100): 
         sleep(0.1) 
         current_task.update_state(state='PROGRESS', 
          meta={'current': i, 'total': 100}) 
    
    
    def poll_state(request): 
        """ A view to report the progress to the user """ 
        if 'job' in request.GET: 
         job_id = request.GET['job'] 
        else: 
         return HttpResponse('No job id given.') 
    
        job = AsyncResult(job_id) 
        data = job.result or job.state 
        return HttpResponse(json.dumps(data), mimetype='application/json') 
    
    
    def init_work(request): 
        """ A view to start a background job and redirect to the status page """ 
        job = do_work.delay() 
        return HttpResponseRedirect(reverse('poll_state') + '?job=' + job.id) 
    
    
    urlpatterns = patterns('webapp.modules.asynctasks.progress_bar_demo', 
        url(r'^init_work$', init_work), 
        url(r'^poll_state$', poll_state, name="poll_state"), 
    ) 
    
    +2

    新しいバージョンでは、 '@task(bind = True)'を実行してから 'self.update_state'を呼び出すことができます。パフォーマンス上の理由から、どちらが良いか分かりません。 – dashesy

    5

    あなたの例を挙げると@Florian Sesserに感謝します。

    私は誰もがそれをダウンロードして使用することができますhttp://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html

    でユーザーに1000個のオブジェクトを作成の進行状況を表示する完全なDjangoのアプリを作りましたよ!

    +1

    ブログに感謝しますが、コードはもう利用できません。 – Demonedge

    +0

    プロジェクトフォルダは次のとおりです。https://www.dropbox.com/sh/o9p92yxhpdx58yh/AABBpO912y3NKgXXU4QeLHAFa?dl=0 –