86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
from flask import Flask, jsonify, make_response, request
|
|
from flask_cors import CORS
|
|
from velconnect.auth import limiter
|
|
from velconnect.logger import logger
|
|
from time import strftime
|
|
import traceback
|
|
|
|
|
|
def create_app():
|
|
app = Flask(
|
|
__name__,
|
|
instance_relative_config=False,
|
|
)
|
|
app.config.from_pyfile('config.py')
|
|
|
|
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
|
|
|
|
limiter.init_app(app)
|
|
|
|
from .routes import api
|
|
app.register_blueprint(api.bp, url_prefix='/api')
|
|
|
|
from .routes import website
|
|
app.register_blueprint(website.bp)
|
|
|
|
# Error handlers
|
|
app.register_error_handler(404, resource_not_found)
|
|
app.register_error_handler(401, noapikey_handler)
|
|
app.register_error_handler(429, ratelimit_handler)
|
|
app.register_error_handler(Exception, exceptions)
|
|
|
|
app.after_request(after_request)
|
|
|
|
return app
|
|
|
|
|
|
# @app.after_request
|
|
def after_request(response):
|
|
""" Logging after every request. """
|
|
# This avoids the duplication of registry in the log,
|
|
# since that 500 is already logged via @app.errorhandler.
|
|
if response.status_code != 500:
|
|
ts = strftime('[%Y-%b-%d %H:%M]')
|
|
logger.error('%s %s %s %s %s %s',
|
|
ts,
|
|
request.remote_addr,
|
|
request.method,
|
|
request.scheme,
|
|
request.full_path,
|
|
response.status)
|
|
return response
|
|
|
|
|
|
# @app.errorhandler(Exception)
|
|
def exceptions(e):
|
|
""" Logging after every Exception. """
|
|
ts = strftime('[%Y-%b-%d %H:%M]')
|
|
tb = traceback.format_exc()
|
|
logger.error('%s %s %s %s %s 5xx INTERNAL SERVER ERROR\n%s',
|
|
ts,
|
|
request.remote_addr,
|
|
request.method,
|
|
request.scheme,
|
|
request.full_path,
|
|
tb)
|
|
|
|
return "SERVER ERROR", 500
|
|
|
|
|
|
# @app.errorhandler(429)
|
|
def ratelimit_handler(e):
|
|
return make_response(
|
|
jsonify(error="ratelimit exceeded %s" % e.description), 429
|
|
)
|
|
|
|
|
|
def resource_not_found(e):
|
|
return jsonify(error=str(e)), 404
|
|
|
|
|
|
# @app.errorhandler(401)
|
|
def noapikey_handler(e):
|
|
return make_response(
|
|
jsonify(error="not authorized %s" % e.description), 401
|
|
)
|