Beispiel #1
0
def generate_log(
    view_name,
    ipaddr,
    remote_addr,
    params,
    request_path,
    host,
    request_data,
    auth_header,
    method,
):
    """a helper function to generate a log from a request, intended when
    we want the same functionality but not as a mixin.
    """
    from shub.apps.logs.models import APIRequestLog

    if ipaddr:
        # X_FORWARDED_FOR returns client1, proxy1, proxy2,...
        ipaddr = [x.strip() for x in ipaddr.split(",")][0]
    else:
        ipaddr = remote_addr

    request_method = method
    view_method = method.lower()

    # create log
    log = APIRequestLog(
        requested_at=now(),
        path=request_path,
        view=view_name,
        view_method=view_method,
        remote_addr=ipaddr,
        host=host,
        method=request_method,
        query_params=params,
    )

    # Get a user, if auth token is provided
    if auth_header:
        try:
            token = Token.objects.get(
                key=auth_header.replace("BEARER", "").strip())
            user = token.user
        except Token.DoesNotExist:
            pass

    log.user = user

    # get data dict
    try:
        log.data = clean_data(request_data.dict())
    except AttributeError:  # if already a dict, can't dictify
        log.data = clean_data(request_data)

    log.save()
Beispiel #2
0
    def initial(self, request, *args, **kwargs):

        ipaddr = request.META.get("HTTP_X_FORWARDED_FOR", None)

        if ipaddr:
            # X_FORWARDED_FOR returns client1, proxy1, proxy2,...
            ipaddr = [x.strip() for x in ipaddr.split(",")][0]
        else:
            ipaddr = request.META.get("REMOTE_ADDR", "")

        # get view
        view_name = ''
        try:
            method = request.method.lower()
            attributes = getattr(self, method)
            view_name = (type(attributes.__self__).__module__ + '.' +
                         type(attributes.__self__).__name__)
        except Exception:
            pass

        # get the method of the view
        if hasattr(self, 'action'):
            view_method = self.action if self.action else ''
        else:
            view_method = method.lower()

        try:
            params = _clean_data(request.query_params.dict())
        except:
            params = {}

        # create log
        self.request.log = APIRequestLog(
            requested_at=now(),
            path=request.path,
            view=view_name,
            view_method=view_method,
            remote_addr=ipaddr,
            host=request.get_host(),
            method=request.method,
            query_params=params,
        )

        # regular initial, including auth check
        super(BaseLoggingMixin, self).initial(request, *args, **kwargs)

        # add user to log after auth
        user = request.user
        if user.is_anonymous:
            user = None
        self.request.log.user = user

        # get data dict
        try:
            # Accessing request.data *for the first time* parses the request body, which may raise
            # ParseError and UnsupportedMediaType exceptions. It's important not to swallow these,
            # as (depending on implementation details) they may only get raised this once, and
            # DRF logic needs them to be raised by the view for error handling to work correctly.
            self.request.log.data = _clean_data(self.request.data.dict())
        except AttributeError:  # if already a dict, can't dictify
            self.request.log.data = _clean_data(self.request.data)