Skip to content
Snippets Groups Projects
common.py 1.61 KiB
Newer Older
Erik Reid's avatar
Erik Reid committed
import functools
import logging
Erik Reid's avatar
Erik Reid committed

from flask import request, Response, current_app, g
from inventory_provider.tasks.common import get_redis as tasks_get_redis
logger = logging.getLogger(__name__)


def get_redis():
    if 'redis_db' not in g:
        config = current_app.config['INVENTORY_PROVIDER_CONFIG']
        g.redis_db = tasks_get_redis(config)
    return g.redis_db
Erik Reid's avatar
Erik Reid committed


def require_accepts_json(f):
    """
    used as a route handler decorator to return an error
    unless the request allows responses with type "application/json"
    :param f: the function to be decorated
    :return: the decorated function
    """
    @functools.wraps(f)
    def decorated_function(*args, **kwargs):
        # TODO: use best_match to disallow */* ...?
        if not request.accept_mimetypes.accept_json:
            return Response(
                response="response will be json",
                status=406,
                mimetype="text/html")
        return f(*args, **kwargs)
    return decorated_function


def after_request(response):
    """
    generic function to do additional logging of requests & responses
    :param response:
    :return:
    """
    if response.status_code != 200:

        try:
            data = response.data.decode('utf-8')
        except Exception:
            # never expected to happen, but we don't want any failures here
            logging.exception('INTERNAL DECODING ERROR')
            data = 'decoding error (see logs)'

        logger.warning('"%s %s" "%s" %s' % (
            request.method,
            request.path,
            data,
            str(response.status_code)))
    return response