【问题标题】:Heroku RQ (Redis Queue) Django Error: "Apps aren't loaded yet."Heroku RQ(Redis 队列)Django 错误:“应用程序尚未加载。”
【发布时间】:2019-05-29 06:16:03
【问题描述】:

我有一个功能强大的 Django 应用程序,它在我看来有许多 Google 文本转语音 API 调用和数据库读/写操作。在本地测试时,加载页面大约需要 3 秒,但是当我将应用程序实时部署到 Heroku 时,加载网页大约需要 15 秒。所以我正在努力减少加载时间。

我看到了这篇文章:https://devcenter.heroku.com/articles/python-rq,它建议我应该通过使用 RQ(Redis 队列)库将作业排队到工作人员来使用后台任务。我按照他们的步骤将他们的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

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

【问题讨论】:

  • 你有redis在本地运行吗?
  • 我没有(这里是 Redis 新手)。但我只是尝试在第三个单独的终端中运行 redis-server,它给了我同样的错误。

标签: python django heroku redis


【解决方案1】:

迟到总比不到好。
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'

【讨论】:

    【解决方案2】:

    您没有发布worker.py 的代码,但我敢打赌它没有正确初始化 Django。看一下manage.py的内容看一个例子。所以,如果worker.py 试图实例化(甚至导入)任何模型、视图等,你会得到这种错误。 Django 需要解析settings.py(除其他外),然后使用它来查找数据库设置、解析模型/关系等。

    最简单的方法是使用django-rq,这是一个简单的库,它集成了 RQ 和 Django 来处理这一切。你的worker.py 基本上只是变成了python manage.py rqworker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2017-08-21
      • 2018-09-19
      • 1970-01-01
      • 2014-12-04
      • 2016-10-05
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多