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()