flask-base/flaskbase/__init__.py
2018-03-31 18:26:40 +02:00

77 lines
1.9 KiB
Python

import flask
import logging
import sys
import os
from flaskbase.extensions import db
from flaskbase.middleware import MethodRewriteMiddleware
_initializers = set()
def import_submodules(app, submodule):
ret = list()
for mod_name in app.config['ENABLED_MODULES']:
try:
# FIXME support for mod_name directing to submodule
mod = __import__('%s.%s' % (mod_name, submodule))
ret.append((mod_name, getattr(mod, submodule)))
except ImportError:
# Check if error occured right in that try clause
if sys.exc_info()[2].tb_next:
logging.warning('Import failed for %s.%s', mod_name, submodule,
exc_info=True)
return ret
def create_app(settings_object=None, settings={}):
app = flask.Flask(
__name__,
template_folder='../templates',
static_folder='../static'
)
if 'SETTINGS_MODULE' in os.environ:
app.config.from_envvar('SETTINGS_MODULE')
else:
if not settings_object:
settings_object = 'flaskbase.settings.{}'.format(
os.environ.get('ENV', 'production'))
app.config.from_object(settings_object)
app.config.update(settings)
# FIXME https://github.com/mattupstate/flask-social/issues/34
app.wsgi_app = MethodRewriteMiddleware(app.wsgi_app)
for m_name, m in import_submodules(app, 'extensions'):
m.init_app(app)
import_submodules(app, 'models')
for m_name, m in import_submodules(app, 'views'):
app.register_blueprint(
m.blueprint,
url_prefix=app.config['URLS'].get(m_name, '/' + m.blueprint.name),
)
import_submodules(app, 'admin')
for fun in _initializers:
fun(app)
logging.info('Starting...')
return app
def initializer(f):
_initializers.add(f)
return f
def init_db(app):
db.create_all()