将 python flask 应用程序上下文传递给 rq 作业的正确方法
Proper way to pass python flask app context to rq jobs
我创建了一个 flask 应用程序,它实际上是一个新闻搜索应用程序。它目前提供许多路由,与 elasticsearch 集成以进行文档搜索和索引,并通过 Flask-SQLAlchemy 与 mySQL 数据库集成。
该应用程序应允许登录用户搜索 document/article,此时会触发 elasticsearch 并将结果返回给用户。这一切都有效。
我现在正在构建使用 RQ 和 Ajax 启动后台异步搜索的功能。现在我需要我的 RQ 来排队搜索(调用一些 APIs)、更新我的数据库和更新我的 ES 索引的任务。所有这些功能都已在我的 Flask 应用程序中构建(搜索 API 调用、配置、DB ORM、ES 接口),因此我希望理想地重用所有这些。
我已经设置了一个 RQ,它调用一个模块,然后尝试创建一个新的应用程序实例,这样我就可以重用现有的 DB/ES 设置,但是当代码被调用:
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)
这导致我在烧瓶方面没有问题,但在 RQ worker 上引发了上述错误
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' 的模块=16=] 文件夹,即 app.app.news_functions 显然不存在。
经过 2 天的努力,我学到了关于为什么我无法导入我知道存在的模块的明确教训!
经常检查你的工作目录,孩子们!
我创建了一个 flask 应用程序,它实际上是一个新闻搜索应用程序。它目前提供许多路由,与 elasticsearch 集成以进行文档搜索和索引,并通过 Flask-SQLAlchemy 与 mySQL 数据库集成。
该应用程序应允许登录用户搜索 document/article,此时会触发 elasticsearch 并将结果返回给用户。这一切都有效。
我现在正在构建使用 RQ 和 Ajax 启动后台异步搜索的功能。现在我需要我的 RQ 来排队搜索(调用一些 APIs)、更新我的数据库和更新我的 ES 索引的任务。所有这些功能都已在我的 Flask 应用程序中构建(搜索 API 调用、配置、DB ORM、ES 接口),因此我希望理想地重用所有这些。
我已经设置了一个 RQ,它调用一个模块,然后尝试创建一个新的应用程序实例,这样我就可以重用现有的 DB/ES 设置,但是当代码被调用:
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)
这导致我在烧瓶方面没有问题,但在 RQ worker 上引发了上述错误
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' 的模块=16=] 文件夹,即 app.app.news_functions 显然不存在。
经过 2 天的努力,我学到了关于为什么我无法导入我知道存在的模块的明确教训!
经常检查你的工作目录,孩子们!