import os from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from werkzeug.exceptions import HTTPException from flask_migrate import Migrate from app.logger import log # instantiate extensions login_manager = LoginManager() db = SQLAlchemy() migration = Migrate() def create_app(environment="development"): from config import config from app.views import ( main_blueprint, auth_blueprint, user_blueprint, book_blueprint, home_blueprint, section_blueprint, vote_blueprint, approve_blueprint, star_blueprint, permissions_blueprint, ) from app.models import ( User, AnonymousUser, ) # Instantiate app. app = Flask(__name__) # Set app config. env = os.environ.get("APP_ENV", environment) configuration = config(env) app.config.from_object(configuration) configuration.configure(app) log(log.INFO, "Configuration: [%s]", configuration.ENV) # Set up extensions. db.init_app(app) migration.init_app(app, db) login_manager.init_app(app) # Register blueprints. app.register_blueprint(auth_blueprint) app.register_blueprint(main_blueprint) app.register_blueprint(user_blueprint) app.register_blueprint(book_blueprint) app.register_blueprint(home_blueprint) app.register_blueprint(section_blueprint) app.register_blueprint(vote_blueprint) app.register_blueprint(approve_blueprint) app.register_blueprint(star_blueprint) app.register_blueprint(permissions_blueprint) # Set up flask login. @login_manager.user_loader def get_user(id): return User.query.get(int(id)) login_manager.login_view = "auth.login" login_manager.login_message_category = "info" login_manager.anonymous_user = AnonymousUser # Jinja globals from app.controllers.jinja_globals import ( form_hidden_tag, display_tags, build_qa_url_using_interpretation, ) app.jinja_env.globals["form_hidden_tag"] = form_hidden_tag app.jinja_env.globals["display_tags"] = display_tags app.jinja_env.globals["build_qa_url"] = build_qa_url_using_interpretation # Error handlers. @app.errorhandler(HTTPException) def handle_http_error(exc): return render_template("error.html", error=exc), exc.code return app