Heroku RQ(Redis队列)Django错误:“应用尚未加载。”

时间:2019-01-02 15:33:13

标签: python django heroku redis

我有一个功能正常的Django应用,在我的视图中有许多Google Text-To-Speech API调用和数据库读/写。在本地测试时,加载页面大约需要3秒钟,但是当我将应用程序实时部署到Heroku时,则需要大约15秒钟才能加载网页。因此,我正在尝试减少加载时间。

我碰到了这篇文章:https://devcenter.heroku.com/articles/python-rq建议我应该通过使用RQ(Redis Queue)库将作业排队给工作人员来使用后台任务。我按照他们的步骤进行操作,并将他们的worker.py文件包含在与我的manage.py文件相同的目录中(不确定是否是放置文件的正确位置)。我想使用虚拟函数在本地对其进行测试,然后查看它是否可以正常运行。

# views.py
from rq import Queue
from worker import conn

def dummy(foo):
    return 2

def my_view(request):
    q = Queue(connection=conn)
    for i in range(10):
        dummy_foo = q.enqueue(dummy, "howdy")
    return render(request, 'dummy.html', {})

我在单独的终端中运行:

$ python worker.py
$ python manage.py runserver

但是在加载网页时,我在"Apps aren't loaded yet."终端上收到了许多python worker.py错误消息。我还没有尝试部署到Heroku,但是我想知道为什么我在本地收到此错误消息?

2 个答案:

答案 0 :(得分:0)

您没有发布worker.py的代码,但是我敢打赌它不能正确初始化Django。查看manage.py的内容以查看示例。因此,如果worker.py试图实例化(或什至导入)任何模型,视图等,您将得到这种错误。 Django需要解析settings.py(除其他事项外),然后使用它来查找数据库设置,解析模型/关系等。

最简单的方法是使用django-rq,这是一个将RQ和Django集成在一起以处理所有这些问题的简单库。您的worker.py实际上就是python manage.py rqworker

答案 1 :(得分:0)

迟到总比不到好。
Django-rq需要Django2.0,很遗憾,对于我们的项目,没有计划升级到最新版本。
因此,如果您处在相同的情况下,仍然可以使用普通的RQ,只需在 worker.py (worker_django_1_11)中添加以下两行:

import django
django.setup()

并传递工人类,如:

> DJANGO_SETTINGS_MODULE=YOURPROJECT.settings rq worker --worker-class='worker_django_1_11.Worker'