Files
MSState-Library-ETD/app/__init__.py
2019-03-22 10:28:11 -05:00

118 lines
3.3 KiB
Python

from flask import Flask
from flask_assets import Environment
from webassets import Bundle
from app.forms import CustomUserManager
from app.models import db, migrate, User
from app.schemas import ma
from flask_mail import Mail
from flask_wtf.csrf import CSRFProtect
# Instantiate Flask extensions
mail = Mail()
csrf_protect = CSRFProtect()
# db and migrate is instantiated in models.py
def create_app():
"""Create and configure the Flask app
Returns:
Flask: the configured app
"""
app = Flask(__name__, instance_relative_config=True)
# Load common settings
app.config.from_object('app.settings')
# Load environment specific settings
app.config.from_object('app.local_settings')
register_extensions(app)
register_blueprints(app)
# Setup an error-logger to send emails to app.config.ADMINS
init_email_error_handler(app)
# Define bootstrap_is_hidden_field for flask-bootstrap's bootstrap_wtf.html
from wtforms.fields import HiddenField
def is_hidden_field_filter(field):
return isinstance(field, HiddenField)
app.jinja_env.globals['bootstrap_is_hidden_field'] = is_hidden_field_filter
return app
def register_extensions(app):
"""Register extensions for Flask app
Args:
app (Flask): Flask app to register for
"""
db.init_app(app)
migrate.init_app(app, db)
ma.init_app(app)
mail.init_app(app)
csrf_protect.init_app(app)
user_manager = CustomUserManager(app, db, User)
@app.context_processor
def context_processor():
return dict(user_manager=user_manager)
assets = Environment(app)
assets.url = app.static_url_path
scss = Bundle('scss/site.scss', filters='libsass', output='site.css')
assets.register('scss_all', scss)
def register_blueprints(app):
"""Register blueprints for Flask app
Args:
app (Flask): Flask app to register for
"""
from .main import main_blueprint
app.register_blueprint(main_blueprint)
# from .auth import auth_blueprint
# app.register_blueprint(auth_blueprint)
def init_email_error_handler(app):
"""
Initialize a logger to send emails on error-level messages.
Unhandled exceptions will now send an email message to app.config.ADMINS.
"""
if app.debug: return # Do not send error emails while developing
# Retrieve email settings from app.config
host = app.config['MAIL_SERVER']
port = app.config['MAIL_PORT']
from_addr = app.config['MAIL_DEFAULT_SENDER']
username = app.config['MAIL_USERNAME']
password = app.config['MAIL_PASSWORD']
secure = () if app.config.get('MAIL_USE_TLS') else None
# Retrieve app settings from app.config
to_addr_list = app.config['ADMINS']
subject = app.config.get('APP_SYSTEM_ERROR_SUBJECT_LINE', 'System Error')
# Setup an SMTP mail handler for error-level messages
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler(
mailhost=(host, port), # Mail host and port
fromaddr=from_addr, # From address
toaddrs=to_addr_list, # To address
subject=subject, # Subject line
credentials=(username, password), # Credentials
secure=secure,
)
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
# Log errors using: app.logger.error('Some error message')