I have a lot of Flask apps running in the background on my home server to do various tasks (home wiki, some CRM stuff, etc) and I end up making the same structure over and over so I figured I would simplify the process and make a repo with just the skeleton of an app.
A few benefits:
- as long as you use relative imports
.
and..
(egfrom .. import app
) your web application is name agnostic. - The flask application instance of
Flask()
can be accessed from anywhere in the web application without a risk of circular import problems. - It’s entirely possible to copy and paste web application modules (eg
models)
into another web application and it will mostly just work (baring configuration needs).
https://github.com/devdave/skeleton_flask
import logging
import sys
from flask import Flask
app:Flask = Flask(__name__)
log:logging.Logger = None
def create_app(config=None)->Flask:
global app, log
from . import conf
log = logging.getLogger(__name__)
fmt = logging.Formatter(app.config['APP_LOGGING_FMT'])
hndl = app.config['APP_LOGGING_HANDLER'] # type: logging.Handler
hndl.setFormatter(fmt)
hndl.setLevel(app.config["APP_LOGGING_LEVEL"])
log.propagate = False
log.handlers.clear() # This removes flask's default handler
log.addHandler(hndl)
log.debug(f"{__name__} loading components")
from . import lib
from . import models
from . import views
from . import settings
return app
https://github.com/devdave/skeleton_flask/blob/master/init.py
This is the __init__.py file in the base of the web app. To use it with flask you would do something like this on the commandline
#>set FLASK_RUN_PORT=1234
#>set FLASK_APP = "webapp:create_app()"
#>set FLASK_ENV = development
#>python -m flask run
OR
#>flask run
The FLASK_APP
environment variable is documented here https://flask.palletsprojects.com/en/1.1.x/cli/#application-discovery and it’s pretty straight forward module:function_name()
where function_name
is defined in module/__init__.py
The reason for having the imports for lib models views settings
in create_app
is to prevent a circular import and allow sub modules like views
to do from .. import app
to access the Flask application instance.