Source code for invenio_app.factory

# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2017-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""Flask application factories for Invenio flavours."""

from __future__ import absolute_import, print_function

import os
import sys

import pkg_resources
from invenio_base.app import create_app_factory
from invenio_base.wsgi import create_wsgi_factory, wsgi_proxyfix
from invenio_cache import BytecodeCache
from invenio_config import create_config_loader

from .helpers import TrustedHostsMixin

env_prefix = 'INVENIO'

invenio_config_loader = create_config_loader(
    config=None, env_prefix=env_prefix
)


[docs]def instance_path(): """Instance path for Invenio. Defaults to ``<env_prefix>_INSTANCE_PATH`` or if environment variable is not set ``<sys.prefix>/var/instance``. """ return os.getenv(env_prefix + '_INSTANCE_PATH') or \ os.path.join(sys.prefix, 'var', 'instance')
[docs]def static_folder(): """Static folder path. Defaults to ``<env_prefix>_STATIC_FOLDER`` or if environment variable is not set ``<sys.prefix>/var/instance/static``. """ return os.getenv(env_prefix + '_STATIC_FOLDER') or \ os.path.join(instance_path(), 'static')
[docs]def static_url_path(): """Static url path. Defaults to ``<env_prefix>_STATIC_URL_PATH`` or if environment variable is not set ``/static``. """ return os.getenv(env_prefix + '_STATIC_URL_PATH') or '/static'
[docs]def config_loader(app, **kwargs_config): """Configuration loader.""" invenio_config_loader(app, **kwargs_config) # TODO: Move this to invenio_cache.ext.InvenioCache.init_app app.jinja_env.cache_size = 1000 app.jinja_env.bytecode_cache = BytecodeCache(app)
[docs]def app_class(): """Create Flask application class. Invenio-Files-REST needs to patch the Werkzeug form parsing in order to support streaming large file uploads. This is done by subclassing the Flask application class. """ try: pkg_resources.get_distribution('invenio-files-rest') from invenio_files_rest.app import Flask as FlaskBase except pkg_resources.DistributionNotFound: from flask import Flask as FlaskBase # Add Host header validation via APP_ALLOWED_HOSTS configuration variable. class Request(TrustedHostsMixin, FlaskBase.request_class): pass class Flask(FlaskBase): request_class = Request return Flask
create_api = create_app_factory( 'invenio', config_loader=config_loader, blueprint_entry_points=['invenio_base.api_blueprints'], extension_entry_points=['invenio_base.api_apps'], converter_entry_points=['invenio_base.api_converters'], wsgi_factory=wsgi_proxyfix(), instance_path=instance_path, root_path=instance_path, app_class=app_class(), ) """Flask application factory for Invenio REST API.""" create_ui = create_app_factory( 'invenio', config_loader=config_loader, blueprint_entry_points=['invenio_base.blueprints'], extension_entry_points=['invenio_base.apps'], converter_entry_points=['invenio_base.converters'], wsgi_factory=wsgi_proxyfix(), instance_path=instance_path, static_folder=static_folder, root_path=instance_path, static_url_path=static_url_path(), app_class=app_class(), ) """Flask application factory for Invenio UI.""" create_app = create_app_factory( 'invenio', config_loader=config_loader, blueprint_entry_points=['invenio_base.blueprints'], extension_entry_points=['invenio_base.apps'], converter_entry_points=['invenio_base.converters'], wsgi_factory=wsgi_proxyfix(create_wsgi_factory({'/api': create_api})), instance_path=instance_path, static_folder=static_folder, root_path=instance_path, static_url_path=static_url_path(), app_class=app_class(), ) """Flask application factory for combined UI + REST API. REST API is mounted under ``/api``. """