轮询 celery 任务并显示 return

Polling celery task and return on display

我是芹菜新手。我正在关注 this example

Views.py

def results(request):
    documents = Document.objects.all()
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            data = form.cleaned_data['name']
            print 'data', data
            newdoc = Document(docfile=request.FILES['docfile'])
            newdoc.save()
        #send it to celery  
    documents = Document.objects.all()
    return render_to_response(
        'results.html',
        {'documents' : documents}, context_instance=RequestContext(request))

用户将上传一个将由引擎处理的文件。与此同时,我希望结果页面显示所有已经完成的工作。我想到了使用芹菜并修改 tasks.py 来处理文件。完成后,该文件将显示为 url 供用户下载。

我想不出一种方法来异步轮询这些任务来实现这部分。 谢谢。

您可以使用 Django-celery-results。它是 celery 的一个简单而漂亮的扩展,使您能够将任务结果存储在 django 数据库中。 使用 :

安装扩展
$ pip install -U django-celery-results

更新 settings.py :

CELERY_RESULT_BACKEND = 'django-db'

INSTALLED_APP = (
    ...
    ...
    django_celery_results
)

通过执行数据库迁移创建 Celery 数据库表:

$ python manage.py migrate django_celery_results

然后您可以从数据库中获取已完成任务的列表并将其显示在您的视图中。

from django_celery_results.models import TaskResult
def tasks_view(request):
    tasks = TaskResult.objects.all()
    template = "tasks.html" 
    return render(request, template, {'tasks': tasks})

定义模板"templates/tasks.html"

 <html>
    <head>
        <title>tasks</title>
    </head>
    <body>
    {% if tasks %}
    <ul>
    {% for task in tasks %}
        <li> {{task.id}} : {{ task.result }}</a></li>
    {% endfor %}
    </ul>
    <p>It works!</p>
   {% else %}
    <p>No tasks are available.</p>
   {% endif %}

    </body>
</html>