python - 将 python flask 应用程序上下文传递给 rq 作业的正确方法

标签 python flask redis rq

我创建了一个 flask 应用程序,它实际上是一个新闻搜索应用程序。它目前提供多种路由,与 elasticsearch 集成以进行文档搜索和索引,并通过 Flask-SQLAlchemy 与 mySQL 数据库集成。

该应用程序应允许登录用户搜索文档/文章,此时会触发 Elasticsearch 并将结果返回给用户。这一切都有效。

我现在正在构建功能以使用 RQ 和 Ajax 启动后台异步搜索。现在我需要我的 RQ 来排队搜索(调用一些 API)、更新我的数据库和更新我的 ES 索引的任务。所有这些功能都已在我的 Flask 应用程序中构建(搜索 API 调用、配置、DB ORM、ES 接口(interface)),因此我希望理想地重用所有这些功能。

我有一个 RQ 设置,它调用一个模块,然后尝试创建一个新的应用程序实例,这样我就可以重用现有的 DB/ES 设置,但是当代码被调用时,我从 RQ 得到一个错误:

File "./news_functions.py", line 14, in <module>
    from app import create_app, db
ModuleNotFoundError: No module named 'app'

应用结构如下:

project
│   project.py   
│
└───app
│   │   __init.py__
│   │   config.py
│   │   models.py
│   │   classes.py
│   │   news_functions.py
│   │   .env
│   │
│   └───main
│       │   __init__.py
│       │   forms.py
│       │   views.py
│       │   ...
│   └───static
│       │   css, etc.
│   └───templates
│       │   templates
│   
└───migrations
    │   ... DB migrations here...
└───logs
    │   ... logs stored here

在我的 views.py 文件中,我尝试使用以下行对任务进行排队:

        job = current_app.task_queue.enqueue('news_functions.execute_search', jobKwargs)

这不会导致 flask 方面出现问题,但会在 RQ 工作人员上引发上述错误

File "./news_functions.py", line 14, in <module>
    from app import create_app, db
ModuleNotFoundError: No module named 'app'

在 news_functions.py 文件中,我试图创建应用程序的一个实例,以便我可以通过以下似乎引发错误的导入和设置重用我的模型等:

from app import create_app, db

app = create_app()
app.app_context().push()

我认为问题在于我正在尝试从应用程序文件夹本身导入 create_app,但我不知道其他选项是什么。如果我向上移动一个文件夹,则 RQ 作业无法将任务排队,因为它超出了应用程序的范围。

我不确定我是否以正确的方式处理这个问题,但我实际上希望能够重用应用程序配置、flask-sqlalchemy、es 设置以在后台执行此附加任务。

希望制作 sesnse 并有人可以提供帮助!

最佳答案

在完全拔掉我的头发后,我意识到我是从 app 目录本身而不是主目录启动 RQ worker,这意味着它实际上是在“app”文件夹中寻找一个名为“app”的模块,即显然不存在的 app.app.news_functions。

经过 2 天的努力,我学到了关于为什么我不能导入我知道存在的模块的明确教训!

经常检查你的工作目录, children !

关于python - 将 python flask 应用程序上下文传递给 rq 作业的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65530755/

相关文章:

javascript - Redis - 持久化个人散列

Python pnoise 返回 0 : why so?

python - 多个类别的出现顺序

python - 如何从 pandas 数据框中的 bool 和 float 列计算新的矢量化列?

json - 根据JSON属性从Redis Sorted Set中删除

python - 使用 django-websocket-redis 的异步 Django

python - 将列表中的每个元素与所有其他元素进行比较

python - 在 python 线程中使用 flask session

python - 为什么有些 Flask 应用程序在每个 SQLAlchemy 语句中都有 `.db`,而其他应用程序则没有?

python - Flask 服务器不会在 Windows 中按 Ctrl+C 停止