-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflask_app.py
More file actions
63 lines (53 loc) · 2.38 KB
/
flask_app.py
File metadata and controls
63 lines (53 loc) · 2.38 KB
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
import os
import json
from datetime import date
from flask import Flask, jsonify, make_response, request, redirect, send_from_directory
from content_api.util import exception_body
from content_api.swagger import generate_swagger
from content_api.models import all_model_routes
app = Flask(__name__)
class JsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, date): # ISO date formating
return str(obj)
return json.JSONEncoder.default(self, obj)
app.json_encoder = JsonEncoder
def flask_response(result):
# response = app.response_class(response=jsonify(result.get('body', {})),
# status=result.get('status', 200),
# mimetype='application/json')
response = make_response(jsonify(result.get('body', {})), result.get('status', 200))
for k, v in result.get('headers', {}).items():
response.headers[k] = v
return response
# Custom generic Flask exception handler (the default is an HTML response)
if not os.environ.get('FLASK_DEBUG', '0'):
@app.errorhandler(Exception)
def handle_exception(e):
return flask_response({'body': exception_body(e), 'status': 500})
def make_flask_routes(model_routes):
def get_flask_handler(index, route):
handler = route['handler']
def flask_handler(**kwargs):
return flask_response(handler({
'path_params': kwargs,
'body': request.json if request.is_json else None,
'headers': dict(request.headers),
'query': dict(request.args)}))
# Flask handler names need to be uniqe, see: https://stackoverflow.com/questions/17256602/assertionerror-view-function-mapping-is-overwriting-an-existing-endpoint-functi
flask_handler.__name__ = f'{route["model_name"]}_{route["name"]}_{index}'
return flask_handler
for index, route in enumerate(model_routes):
print(route['method'], route['path'])
app.route(route['path'], methods = [route['method']])(get_flask_handler(index, route))
@app.route('/static/<path:path>')
def send_static(path):
return send_from_directory('./static', path)
model_routes = all_model_routes()
make_flask_routes(model_routes)
@app.route('/')
def redirect_to_swagger():
return redirect('/static/index.html')
@app.route('/v1/swagger.json')
def swagger_json():
return jsonify(generate_swagger(model_routes))