効果的にニュース検索アプリであるフラスコ アプリを作成しました。現在、多くのルートを提供し、ドキュメントの検索とインデックス作成のために Elasticsearch と統合し、Flask-SQLAlchemy を介して mySQL DB と統合しています。
アプリは、ログインしたユーザーがドキュメント/記事を検索できるようにする必要があります。その時点で、elasticsearch がトリガーされ、結果がユーザーに返されます。これはすべて機能します。
現在、RQ と Ajax を使用してバックグラウンドで非同期検索を開始する機能を構築しています。ここで、検索 (いくつかの API の呼び出し)、DB の更新、および ES インデックスの更新を行うタスクをキューに入れるために、RQ が必要です。この機能はすべて、私の Flask アプリ (検索 API 呼び出し、構成、DB ORM、ES インターフェイス) 内で既に構築されているため、理想的にはそれらすべてを再利用したいと考えています。
既存の DB/ES セットアップを再利用できるように、新しいアプリケーション インスタンスを作成しようとするモジュールを呼び出す RQ セットアップがありますが、コードが呼び出されると 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)
これにより、フラスコ側で問題は発生しませんが、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 セットアップを効果的に再利用して、この追加タスクをバックグラウンドで実行できるようにしたいと考えています。
うまくいけば、意味があり、誰かが助けることができます!