Я працюю над (за моїми стандартами) великим проектом 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'])
Сподіваюсь, це може бути для вас натхненням :)