view piecrust/admin/web.py @ 853:f070a4fc033c

core: Continue PieCrust3 refactor, simplify pages. The asset pipeline is still the only function pipeline at this point. * No more `QualifiedPage`, and several other pieces of code deleted. * Data providers are simpler and more focused. For instance, the page iterator doesn't try to support other types of items. * Route parameters are proper known source metadata to remove the confusion between the two. * Make the baker and pipeline more correctly manage records and record histories. * Add support for record collapsing and deleting stale outputs in the asset pipeline.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 21 May 2017 00:06:59 -0700
parents 82509bce94ca
children dcdec4b951a1
line wrap: on
line source

import os.path
import logging
from flask import Flask, render_template
from werkzeug import SharedDataMiddleware
from .blueprint import foodtruck_bp
from .configuration import FoodTruckConfigNotFoundError
from .sites import InvalidSiteError


logger = logging.getLogger(__name__)


def create_foodtruck_app(extra_settings=None):
    app = Flask(__name__.split('.')[0], static_folder=None)
    app.config.from_object('piecrust.admin.settings')
    app.config.from_envvar('FOODTRUCK_SETTINGS', silent=True)
    if extra_settings:
        app.config.update(extra_settings)

    admin_root = app.config.setdefault('FOODTRUCK_ROOT', os.getcwd())
    config_path = os.path.join(admin_root, 'app.cfg')

    # If we're being run as the `chef admin run` command, from inside a
    # PieCrust website, do a few things differently.
    app.config['FOODTRUCK_PROCEDURAL_CONFIG'] = None
    if (app.config.get('FOODTRUCK_CMDLINE_MODE', False) and
            os.path.isfile(os.path.join(admin_root, 'config.yml'))):
        app.secret_key = os.urandom(22)
        app.config['LOGIN_DISABLED'] = True
        app.config['FOODTRUCK_PROCEDURAL_CONFIG'] = {
            'sites': {
                'local': admin_root}
        }

    # Add a special route for the `.well-known` directory.
    app.wsgi_app = SharedDataMiddleware(
        app.wsgi_app,
        {'/.well-known': os.path.join(admin_root, '.well-known')})

    if os.path.isfile(config_path):
        app.config.from_pyfile(config_path)

    if app.config['DEBUG']:
        l = logging.getLogger()
        l.setLevel(logging.DEBUG)
    else:
        @app.errorhandler(FoodTruckConfigNotFoundError)
        def _on_config_missing(ex):
            return render_template('install.html')

        @app.errorhandler(InvalidSiteError)
        def _on_invalid_site(ex):
            data = {'error':
                    "The was an error with your configuration file: %s" %
                    str(ex)}
            return render_template('error.html', **data)

    if not app.secret_key:
        # If there's no secret key, create a temp one but mark the app as not
        # correctly installed so it shows the installation information page.
        app.secret_key = 'temp-key'

    # Register extensions and blueprints.
    app.register_blueprint(foodtruck_bp)

    logger.debug("Created FoodTruck app with admin root: %s" % admin_root)

    return app