From ed7485a8a16b60dde8acc0d2b9afca00a75fce3c Mon Sep 17 00:00:00 2001 From: "Maxime Alves LIRMM@home" Date: Thu, 17 Jun 2021 18:15:10 +0200 Subject: [PATCH] =?UTF-8?q?[app]=20Use=20HalfAPI=20class=20to=20be=20able?= =?UTF-8?q?=20to=20use=20custom=20configuration=20=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- halfapi/app.py | 115 +++++++++++++++++++++++++++++------------------- halfapi/conf.py | 26 ++++++----- 2 files changed, 86 insertions(+), 55 deletions(-) diff --git a/halfapi/app.py b/halfapi/app.py index 7e72090..17349df 100644 --- a/halfapi/app.py +++ b/halfapi/app.py @@ -23,7 +23,6 @@ from timing_asgi import TimingMiddleware from timing_asgi.integrations import StarletteScopeToName # module libraries -from halfapi.conf import CONFIG, SECRET, PRODUCTION, DOMAINSDICT from .lib.domain_middleware import DomainMiddleware from .lib.timing import HTimingClient @@ -34,61 +33,87 @@ from halfapi.lib.responses import (ORJSONResponse, UnauthorizedResponse, NotFoundResponse, InternalServerErrorResponse, NotImplementedResponse) from halfapi.lib.routes import gen_starlette_routes, debug_routes -from halfapi.lib.schemas import get_api_routes, schema_json, get_acls +from halfapi.lib.schemas import get_api_routes, get_api_domain_routes, schema_json, get_acls logger = logging.getLogger('uvicorn.asgi') -routes = [ Route('/', get_api_routes) ] + +class HalfAPI: + def __init__(self, config=None): + if config: + SECRET = config.get('SECRET') + PRODUCTION = config.get('PRODUCTION') + DOMAINS = config.get('DOMAINS') + CONFIG = config.get('CONFIG', { + 'domains': DOMAINS + }) + else: + from halfapi.conf import CONFIG, SECRET, PRODUCTION, DOMAINS -routes += [ - Route('/halfapi/schema', schema_json), - Route('/halfapi/acls', get_acls) -] - -routes += Route('/halfapi/current_user', lambda request, *args, **kwargs: - ORJSONResponse({'user':request.user.json}) - if SECRET and not isinstance(request.user, UnauthenticatedUser) - else ORJSONResponse({'user': None})), + routes = [ Route('/', get_api_routes) ] -if not PRODUCTION: - for route in debug_routes(): - routes.append( route ) + routes += [ + Route('/halfapi/schema', schema_json), + Route('/halfapi/acls', get_acls) + ] + + routes += Route('/halfapi/current_user', lambda request, *args, **kwargs: + ORJSONResponse({'user':request.user.json}) + if SECRET and not isinstance(request.user, UnauthenticatedUser) + else ORJSONResponse({'user': None})), -if DOMAINSDICT: - for route in gen_starlette_routes(DOMAINSDICT()): - routes.append(route) + if not PRODUCTION: + for route in debug_routes(): + routes.append( route ) -application = Starlette( - debug=not PRODUCTION, - routes=routes, - exception_handlers={ - 401: UnauthorizedResponse, - 404: NotFoundResponse, - 500: InternalServerErrorResponse, - 501: NotImplementedResponse - } -) + if DOMAINS: + for route in gen_starlette_routes(DOMAINS): + routes.append(route) -if DOMAINSDICT: - application.add_middleware( - DomainMiddleware, - config=CONFIG - ) + for domain in DOMAINS: + routes.append( + Route( + f'/{domain}', + get_api_domain_routes(domain) + ) + ) -if SECRET: - application.add_middleware( - AuthenticationMiddleware, - backend=JWTAuthenticationBackend(secret_key=SECRET) - ) -if not PRODUCTION: - application.add_middleware( - TimingMiddleware, - client=HTimingClient(), - metric_namer=StarletteScopeToName(prefix="halfapi", - starlette_app=application) - ) + self.application = Starlette( + debug=not PRODUCTION, + routes=routes, + exception_handlers={ + 401: UnauthorizedResponse, + 404: NotFoundResponse, + 500: InternalServerErrorResponse, + 501: NotImplementedResponse + } + ) + + print(f'HALFAPI CONFIG: {CONFIG}') + self.application.add_middleware( + DomainMiddleware, + config=CONFIG + ) + + if SECRET: + self.application.add_middleware( + AuthenticationMiddleware, + backend=JWTAuthenticationBackend(secret_key=SECRET) + ) + + if not PRODUCTION: + self.application.add_middleware( + TimingMiddleware, + client=HTimingClient(), + metric_namer=StarletteScopeToName(prefix="halfapi", + starlette_app=self.application) + ) + + + +application = HalfAPI().application diff --git a/halfapi/conf.py b/halfapi/conf.py index c69ecc7..a89e09b 100644 --- a/halfapi/conf.py +++ b/halfapi/conf.py @@ -53,16 +53,11 @@ LOGLEVEL = 'info' HOST = '127.0.0.1' PORT = '3000' SECRET = '' +CONF_FILE = os.environ.get('HALFAPI_CONF_FILE', '.halfapi/config') -IS_PROJECT = os.path.isfile('.halfapi/config') +is_project = lambda: os.path.isfile(CONF_FILE) -CONFIG = { - 'project_name': PROJECT_NAME, - 'production': PRODUCTION, - 'secret': SECRET, - 'domains': DOMAINS -} default_config = { 'project': { @@ -84,7 +79,7 @@ HALFAPI_ETC_FILE=os.path.join( HALFAPI_DOT_FILE=os.path.join( os.getcwd(), '.halfapi', 'config') -HALFAPI_CONFIG_FILES = [ HALFAPI_ETC_FILE, HALFAPI_DOT_FILE ] +HALFAPI_CONFIG_FILES = [ CONF_FILE, HALFAPI_DOT_FILE ] def conf_files(): return [ @@ -121,8 +116,11 @@ def read_config(): -if IS_PROJECT: - read_config() +CONFIG = {} +IS_PROJECT = False +if is_project(): + IS_PROJECT = True + CONFIG = read_config() PROJECT_NAME = config.get('project', 'name', fallback=PROJECT_NAME) @@ -150,3 +148,11 @@ if IS_PROJECT: LOGLEVEL = config.get('project', 'loglevel').lower() or 'info' BASE_DIR = config.get('project', 'base_dir', fallback='.') #os.getcwd()) + + CONFIG = { + 'project_name': PROJECT_NAME, + 'production': PRODUCTION, + 'secret': SECRET, + 'domains': DOMAINS + } +