Как можно упростить или автоматизировать процесс подключения роутов?

Как можно красиво подключать роуты из папки "handlers" в "webhook.py" без необходимости редактировать "webhook.py" при добавлении новых хендлеров?
  • 19 октября 2023 г. 15:38
Ответы на вопрос 2
Для автоматического подключения роутов из папки "handlers" в "webhook.py" можно использовать следующий подход:

1. Создайте отдельный модуль, например "routes.py", который будет отвечать за подключение роутов.
2. Внутри "routes.py" создайте функцию или метод, например "register_routes(app)", которая будет принимать экземпляр вашего Flask-приложения.
3. Внутри "register_routes(app)" используйте функцию "os.listdir()" для получения списка файлов в папке "handlers".
4. Пройдитесь по каждому файлу, проверяя его расширение (например, только файлы с расширением ".py") и импортируйте каждый модуль с помощью функции "import_module()" из модуля "importlib".
5. После импорта модуля, проверьте наличие атрибута "routes" в нем (ваша функция-обработчик), и если он существует, зарегистрируйте успешно найденные роуты в вашем Flask-приложении, используя декораторы или методы регистрации роутов, такие как "app.route()".
6. В итоге, ваш "webhook.py" будет выглядеть так:

```python
from flask import Flask
from importlib import import_module
from routes import register_routes

app = Flask(__name__)

register_routes(app)

if __name__ == '__main__':
    app.run()
```

7. Вся логика обработчиков и их добавление произойдет автоматически при запуске "webhook.py" без необходимости редактировать его при добавлении новых хендлеров в папку "handlers".

Важно отметить, что данное решение предоставляет только базовый пример и может потребовать дополнительной настройки в зависимости от требований вашего проекта.
Можно использовать следующий код для импорта модулей внутри каталога "webhooks":

```python
from pathlib import Path
import importlib
import sys

SCRIPT = Path(sys.argv[0]).parent.resolve()
IMPORT_FROM = 'webhooks'

for fpath in (SCRIPT / IMPORT_FROM).iterdir():
    # Импортируем только файлы с расширением .py или каталоги с файлом __init__.py внутри
    # Пропускаем файлы начинающиеся с _ или . 
    if not fpath.stem.startswith('_') and not fpath.stem.startswith('.') and \
            ((fpath.suffix == '.py') or (fpath.is_dir() and (fpath / '__init__.py').is_file())):  
        try:
            # Эквивалент import webhooks.module_name as module
            module = importlib.import_module(f'{IMPORT_FROM}.{fpath.stem}')
            dp.include_router(module.router)
        except Exception as err:
            print(err)  # Выводим ошибку в случае возникновения исключения
```

Этот код позволяет импортировать все файлы модулей внутри каталога "webhooks" и подкаталогов с файлом "__init__.py".
Похожие вопросы