Я працюю над (за моїми стандартами) великим проектом Flask (5000 рядків коду Python, і це лише напівзакінчено). Замовник хоче, щоб проект був модульним, тому я взяв наступне:
Моя структура папок виглядає так:
├── __init__.py
├── modules.yml
├── config
├── controllers
│ └── ...
├── lib: Common functions I use often
│ └── ...
├── models
│ └── ...
├── static: All static files
│ ├── css
│ ├── img
│ └── js
└── templates: Jinja2 templates
└── ...
В modules.ymlвизначаю мої модулі , включаючи ім'я та URL. Таким чином, клієнт може вмикати / вимикати модулі, не торкаючись жодного файлу Python. Крім того, я створюю меню на основі списку модулів. За домовленістю, кожен модуль має свій власний Python-модуль, controllers/який завантажує його modelз models/. Кожен контролер визначає Blueprintзбережене як ім'я контролера. Наприклад, для userмодуля, я маю в controllers/user.py:
user = Blueprint('user', __name__)
@user.route('/user/')
def index():
pass
Таким чином, я можу прочитати modules.ymlв моїй __init__.pyі навантаженні і зареєструвати всі задіяні модулі динамічно:
for module in modules:
modname = module['url'][1:]
try:
mod = __import__(
'project.controllers.' + modname, None, None, modname
)
except Exception as e:
mod = getattr(mod, modname)
app.register_blueprint(mod, url_prefix=module['url'])
Сподіваюсь, це може бути для вас натхненням :)