【问题标题】:Django Progress Bar (with celery not working)Django 进度条(芹菜不工作)
【发布时间】:2021-07-12 12:59:08
【问题描述】:

所以,我正在为我的投资组合网站制作这个推特推文分析器,我想为什么不制作一个进度条,因为加载和解析推文需要一段时间(大约 200 条)。有多难?

我使用 Celery + redis + celery-progress 在 Google 搜索中找到了这个 video。好的,看了视频,然后我阅读了 celery-progress 的github + 两篇(12)关于该过程的文章。看起来很简单。

所以我设置了`celery.py`

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings')

app = Celery('my_proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

同时设置`settings.py`

INSTALLED_APPS = [
    .......
    'django_celery_results',
    # Celery apps
    'celery',
    'celery_progress'
]
.
.
.
CELERY_BROKER_URL = 'redis url'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis url'

还设置了`init.py`

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

最后我在tasks.py中做了一个test_task

from celery import shared_task
from celery_progress.backend import ProgressRecorder
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import tweepy

import time
@shared_task(bind=True)
def test_task(self):
    print("Task Started")
    progress_recorder = ProgressRecorder(self)
    for i in range(5):
        time.sleep(1)
        print(i)
        progress_recorder.set_progress(i+1, 5, description="Processing...")
    print("End")
    return "Completed"

视频中的那个人也使用了django-celery-results。但由于某种原因,我总是得到一个 NO NULL 异常。所以我只是像其他指南一样使用 redis 作为后端。

我的第一期。经纪人。该视频使用heroku redis。出于某种原因,我根本无法连接(在我的本地主机上测试)。发现 heroku redis 只在 heroku 平台本身上工作。所以我切换到 Redis To Go。

[tasks]
  . main_page.tasks.get_tweets
  . main_page.tasks.test_task
  . portfolio_website.celery.debug_task

[2021-04-17 23:19:36,358: INFO/MainProcess] Connected to redis://redistogo:**@soapfish.redistogo.com:11025//
[2021-04-17 23:19:36,486: INFO/MainProcess] mingle: searching for neighbors
[2021-04-17 23:19:36,712: INFO/SpawnPoolWorker-6] child process 19360 calling self.run()
[2021-04-17 23:19:36,724: INFO/SpawnPoolWorker-2] child process 14712 calling self.run()
[2021-04-17 23:19:36,727: INFO/SpawnPoolWorker-3] child process 10332 calling self.run()
[2021-04-17 23:19:36,730: INFO/SpawnPoolWorker-1] child process 2716 calling self.run()
[2021-04-17 23:19:36,740: INFO/SpawnPoolWorker-7] child process 9084 calling self.run()
[2021-04-17 23:19:36,749: INFO/SpawnPoolWorker-4] child process 19752 calling self.run()
[2021-04-17 23:19:36,760: INFO/SpawnPoolWorker-8] child process 22720 calling self.run()
[2021-04-17 23:19:36,765: INFO/SpawnPoolWorker-5] child process 5888 calling self.run()
[2021-04-17 23:19:38,187: INFO/MainProcess] mingle: all alone

到目前为止一切顺利。我可以连接到 redis (Redis to Go)。是时候在前端进行测试了。

好的,先试试。刚刚彻底崩溃。后端似乎有错误。所以我现在只禁用 celery 后端。 (反正我真的不需要存储结果)。

TypeError at /twitter_stock/

sequence item 1: expected a bytes-like object, NoneType foun

任务确实开始了,但进度条根本没有出现。还有这个属性错误。

95a539f9-c105-4180-961f-02f223809314
Task Started
0
1
2
3
4
End
posted
AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

HTML

  <div class="row justify-content-center pt-3">
    <div class='progress-wrapper'>
      <div id='progress-bar' class='progress-bar' style="background-color: #68a9ef; width: 0%;">&nbsp;</div>
    </div>
    <div id="progress-bar-message">Waiting for your tweet...</div>
  </div>

  <script src="{% static 'celery_progress/celery_progress.js' %}"></script>

  {% if task_id %}
<script type="text/javascript">
    // Progress Bar (JQuery)
    $(function () {
        var progressUrl = "{% url 'celery_progress:task_status' task_id %}";
        CeleryProgressBar.initProgressBar(progressUrl, {})
    });
</script>
{% endif %}

视图(过于简单化)

def twitter_stock(request):
    task = test_task.delay()
    task_id = task.task_id
    .
    .
    .
    print(task.id)
        return render(request,{'task_id': task_id})

我正在使用 Jquery CDN。我也在考虑测试 Amazon SQS。但现在我被困住了。我真的不知道该怎么办。如果那里的某个人实际上知道替代方案(必须有一种更简单的方法来做到这一点)或知道如何使这项工作发挥作用,我将不胜感激。感谢您承担这么长的帖子。

TLDR:尝试使用 Celery + celery-progress + Redis 制作进度条。没用。

【问题讨论】:

    标签: django redis celery


    【解决方案1】:

    因为我遇到了同样的问题

    AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'
    

    即使在我的 django-admin 中我也无法查看进度,因为没有存储记录,所以我发现需要在项目设置中定义这一行

    CELERY_RESULT_BACKEND = "django-db"
    

    这解决了我的问题,我希望这也能解决你的问题

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多