Ich arbeite an einem (nach meinen Maßstäben) großen Flask-Projekt (5000 Zeilen Python-Code und es ist nur halb fertig). Der Kunde möchte, dass das Projekt modular aufgebaut ist, daher habe ich diesen Ansatz gewählt:
Meine Ordnerstruktur sieht folgendermaßen aus:
├── __init__.py
├── modules.yml
├── config
├── controllers
│ └── ...
├── lib: Common functions I use often
│ └── ...
├── models
│ └── ...
├── static: All static files
│ ├── css
│ ├── img
│ └── js
└── templates: Jinja2 templates
└── ...
In modules.yml
definiere ich meine Module einschließlich Name und URL. Auf diese Weise kann der Kunde Module aktivieren / deaktivieren, ohne eine einzelne Python-Datei zu berühren. Außerdem generiere ich die Menüs basierend auf der Modulliste. Vereinbarungsgemäß jedes Modul hat sein eigenes Python-Modul in controllers/
dem seiner Last wird model
aus models/
. Jeder Controller definiert einen Blueprint
als Controller gespeicherten Namen. ZB für ein user
Modul habe ich in controllers/user.py
:
user = Blueprint('user', __name__)
@user.route('/user/')
def index():
pass
Auf diese Weise kann ich das modules.yml
in my lesen __init__.py
und alle aktivierten Module dynamisch laden und registrieren:
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'])
Ich hoffe, das kann eine Inspiration für dich sein :)