-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun.py
68 lines (52 loc) · 2.19 KB
/
run.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import argparse
import os
import uvicorn
import argparse
from fastapi.applications import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from bootstrapi.router import BootstrAPIRouter
class EnvDefault(argparse.Action):
'''
This is an helper class for the ArgumentParser.
It checks whether an environment variable exists and uses this as default argument if it does.
'''
def __init__(self, envvar, required=True, default=None, **kwargs):
if envvar:
if envvar in os.environ:
default = os.environ[envvar]
if required and default:
required = False
super(EnvDefault, self).__init__(default=default, required=required,
**kwargs)
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
if __name__ == '__main__':
'''
Creates an FastAPI instance and starts the Uvicorn server
'''
parser = argparse.ArgumentParser(description='Bootstrap an API')
parser.add_argument("connection", help="SQLAlchemy connection string to a database",action=EnvDefault, envvar='connection',type=str)
parser.add_argument("--title", help="The title of the API", default="BootstrAPI Instance",action=EnvDefault, envvar='title',type=str)
parser.add_argument("--host", help="The hostname",default="0.0.0.0",action=EnvDefault, envvar='host',type=str)
parser.add_argument("--port", help="The port",default="8000",action=EnvDefault, envvar='port',type=int)
parser.add_argument("--schema", help="The schema of the database",default="#empty#",action=EnvDefault, envvar='schema',type=str)
args = parser.parse_args()
engine = create_engine(args.connection)
app = FastAPI(title=args.title)
Base = automap_base()
if args.schema=="#empty#":
schema = None
else:
schema = args.schema
print(f"""
Starting app with:
Title: {args.title}
Host: {args.host}
Port: {args.port}
Schema: {schema}
""")
Base.prepare(engine,schema = schema)
router = BootstrAPIRouter(engine,Base)
app.include_router(router)
uvicorn.run(app, host=args.host, port=args.port)