Я создал приложение flask, которое фактически является приложением для поиска новостей. В настоящее время оно обслуживает несколько маршрутов, интегрируется с elasticsearch для поиска и индексации документов и интегрируется с СУБД mySQL через Flask-SQLAlchemy.

Приложение должно позволять вошедшим в систему пользователям искать документ/статью, после чего запускается elasticsearch и результаты возвращаются пользователю. Все это работает.

В настоящее время я создаю функциональность для запуска фонового асинхронного поиска с помощью RQ и Ajax. Теперь мне нужно, чтобы мой RQ поставил в очередь задачу, которая будет искать (вызывая несколько API), обновлять мою БД и обновлять мой индекс ES. Вся эта функциональность уже была создана в моем приложении Flask (вызовы API для поиска, конфигурация, ОРМ для БД, интерфейс ES), поэтому в идеале я хочу использовать все это повторно.

.

У меня есть RQ, который вызывает модуль, который затем пытается создать новый экземпляр приложения, чтобы я мог повторно использовать существующие настройки DB/ES, но я получаю ошибку от RQ, когда вызывается код:

File "./news_functions.py", line 14, in 
    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 worker

File "./news_functions.py", line 14, in 
    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 setup для выполнения этой дополнительной задачи в фоновом режиме.

Надеемся, что это поможет, и кто-то сможет помочь!

peetysmith

Ответов: 1

Ответы (1)

После того, как я полностью выдрал свои волосы, я понял, что я запустил RQ worker из самой директории app, а не из основной директории, что означает, что он эффективно искал модуль с именем 'app' в папке 'app', т.е. app.app.news_functions, который, очевидно, не существовал.

Бесконечный урок, полученный после того, как я 2 дня выдирал из себя волосы, пытаясь понять, почему я не могу импортировать модуль, о существовании которого я знал!

Всегда проверяйте свои рабочие каталоги, дети!

2022 WebDevInsider