Я работаю над (по моим стандартам) большим проектом 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
:
# Module name is 'user', thus save Blueprint as 'user' variable
user = Blueprint('user', __name__)
@user.route('/user/')
def index():
pass
Таким образом, я могу прочитать modules.yml
в моем __init__.py
и динамически загружать и регистрировать все включенные модули:
# Import modules
for module in modules:
# Get module name from 'url' setting, exculde leading slash
modname = module['url'][1:]
try:
# from project.controllers.<modname> import <modname>
mod = __import__(
'project.controllers.' + modname, None, None, modname
)
except Exception as e:
# Log exceptions here
# [...]
mod = getattr(mod, modname) # Get blueprint from module
app.register_blueprint(mod, url_prefix=module['url'])
Надеюсь, это может послужить вам источником вдохновения:)