【发布时间】:2021-07-12 12:59:08
【问题描述】:
所以,我正在为我的投资组合网站制作这个推特推文分析器,我想为什么不制作一个进度条,因为加载和解析推文需要一段时间(大约 200 条)。有多难?
我使用 Celery + redis + celery-progress 在 Google 搜索中找到了这个 video。好的,看了视频,然后我阅读了 celery-progress 的github + 两篇(1,2)关于该过程的文章。看起来很简单。
所以我设置了`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%;"> </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 制作进度条。没用。
【问题讨论】: