Passed
Push — issue895-nn-ensemble-pytorch ( 85057c...fb38ef )
by Osma
04:28
created

annif._set_tensorflow_loglevel()   A

Complexity

Conditions 1

Size

Total Lines 15
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 11
nop 0
dl 0
loc 15
rs 9.85
c 0
b 0
f 0
1
#!/usr/bin/env python3
2
3
from __future__ import annotations
4
5
import logging
6
import os
7
import os.path
8
from typing import TYPE_CHECKING
9
10
from flask import Flask
11
12
logging.basicConfig()
13
logger = logging.getLogger("annif")
14
logger.setLevel(level=logging.INFO)
15
16
import annif.backend  # noqa
17
18
if TYPE_CHECKING:
19
    from connexion.apps.flask import FlaskApp
20
21
22
def create_flask_app(config_name: str | None = None) -> Flask:
23
    """Create a Flask app to be used by the CLI."""
24
25
    app = Flask(__name__)
26
    config_name = _get_config_name(config_name)
27
    logger.debug(f"creating flask app with configuration {config_name}")
28
    app.config.from_object(config_name)
29
    app.config.from_envvar("ANNIF_SETTINGS", silent=True)
30
    return app
31
32
33
def create_cx_app(config_name: str | None = None) -> FlaskApp:
34
    """Create a Connexion app to be used for the API."""
35
    import connexion
36
    from connexion.datastructures import MediaTypeDict
37
    from connexion.middleware import MiddlewarePosition
38
    from connexion.validators import FormDataValidator, MultiPartFormDataValidator
39
    from starlette.middleware.cors import CORSMiddleware
40
41
    import annif.registry
42
    from annif.openapi.validation import CustomRequestBodyValidator
43
44
    specdir = os.path.join(os.path.dirname(__file__), "openapi")
45
    cxapp = connexion.FlaskApp(__name__, specification_dir=specdir)
46
    config_name = _get_config_name(config_name)
47
    logger.debug(f"creating connexion app with configuration {config_name}")
48
    cxapp.app.config.from_object(config_name)
49
    cxapp.app.config.from_envvar("ANNIF_SETTINGS", silent=True)
50
51
    validator_map = {
52
        "body": MediaTypeDict(
53
            {
54
                "*/*json": CustomRequestBodyValidator,
55
                "application/x-www-form-urlencoded": FormDataValidator,
56
                "multipart/form-data": MultiPartFormDataValidator,
57
            }
58
        ),
59
    }
60
    cxapp.add_api("annif.yaml", validator_map=validator_map)
61
62
    # add CORS support
63
    cxapp.add_middleware(
64
        CORSMiddleware,
65
        position=MiddlewarePosition.BEFORE_EXCEPTION,
66
        allow_origins=["*"],
67
    )
68
69
    if cxapp.app.config["INITIALIZE_PROJECTS"]:
70
        annif.registry.initialize_projects(cxapp.app)
71
        logger.info("finished initializing projects")
72
73
    # register the views via blueprints
74
    from annif.views import bp
75
76
    cxapp.app.register_blueprint(bp)
77
78
    # return the Connexion app
79
    return cxapp
80
81
82
create_app = create_cx_app  # Alias to allow starting directly with uvicorn run
83
84
85
def _get_config_name(config_name: str | None) -> str:
86
    if config_name is None:
87
        config_name = os.environ.get("ANNIF_CONFIG")
88
    if config_name is None:
89
        if os.environ.get("FLASK_RUN_FROM_CLI") == "true":  # pragma: no cover
90
            config_name = "annif.default_config.Config"
91
        else:
92
            config_name = "annif.default_config.ProductionConfig"  # pragma: no cover
93
    return config_name
94