VEL-Connect/velconnect/__init__.py

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
)