Source code for fasjson.web.app
import os
from logging.config import dictConfig
from flask import Flask
from flask_healthz import healthz
from flask_mod_auth_gssapi import FlaskModAuthGSSAPI
from flask_restx import abort
from werkzeug.exceptions import HTTPException
from werkzeug.routing import BaseConverter
from .apis.errors import api as api_errors
from .apis.errors import blueprint as blueprint_errors
from .apis.v1 import blueprint as blueprint_v1
from .base_routes import root
from .extensions.flask_ipacfg import IPAConfig
[docs]
class NameConverter(BaseConverter):
"""Limit what a user or group name can look like in the URLs."""
regex = "[a-zA-Z0-9][a-zA-Z0-9_.-]{0,63}"
[docs]
def create_app(config=None):
"""See https://flask.palletsprojects.com/en/1.1.x/patterns/appfactories/"""
app = Flask(__name__)
# Load default configuration
app.config.from_pyfile("defaults.cfg")
# Load the optional configuration file
if "FASJSON_CONFIG_PATH" in os.environ:
app.config.from_envvar("FASJSON_CONFIG_PATH")
# Load the config passed as argument
app.config.update(config or {})
# Logging
if app.config.get("LOGGING"):
dictConfig(app.config["LOGGING"])
# Extensions
FlaskModAuthGSSAPI(app, abort=abort)
IPAConfig(app)
# URL converters
app.url_map.converters["name"] = NameConverter
# Register APIs
# TODO: consider having only one class per resource and passing the API version from the
# global g variable as described here:
# https://flask.palletsprojects.com/en/1.1.x/patterns/urlprocessors/#internationalized-blueprint-urls
app.register_blueprint(blueprint_v1)
app.register_blueprint(healthz, url_prefix="/healthz")
# Handler for webserver errors
app.register_blueprint(blueprint_errors)
# Make the main app's error handler use the error API's error handler in order to output JSON
app.register_error_handler(HTTPException, api_errors.handle_error)
# Register the root view
app.add_url_rule("/", endpoint="root", view_func=root)
return app