как записать имя пользователя, вошедшего в систему, в django?

#python #django #django-rest-framework

Вопрос:

 class logEngine:

    def logger(request):
        t1 = time.time()
        params = {'user': request.user.username,
                  'ip_address': socket.gethostbyname(socket.gethostname()),
                  'process_time': time.time() - t1,
                  }
        return params
 

когда я использую request.user.username (который приведен в большинстве примеров в Интернете), я получаю следующую ошибку,

Ошибка атрибута: объект «logEngine» не имеет атрибута «пользователь»

Пожалуйста, предложите любой другой способ

Комментарии:

1. Что logEngine должно быть? Промежуточное ПО? Также этот метод logger должен приниматься self в качестве первого аргумента (похоже, вы даже не передаете ему запрос, иначе вы получили бы ошибку типа TypeError: logger() takes 1 positional argument but 2 were given

2. logEngine-это класс, который я создал, чтобы указать имя пользователя, ip, время процесса. Возвращаемые значения из logEngine().logger() передаются в другую функцию. Кроме того, я использовал self. Но он также возвращает ту же ошибку

3. Вы также должны предоставить другие модели. Непонятно, почему django пытается получить менеджер пользователей из модели logEngine вместо встроенной модели пользователя здесь. И, возможно, вы сможете получить необходимые данные, фактически не используя модель logEngine. Поэтому уточните, является ли использование модели logEngine обязательным.

4. @yuv logEngne не является обязательным. Просто нужно захватить текущего пользователя, вошедшего в систему.

5. Затем удалите logEngine , и команда request.user.username должна работать, если вы не перепутали настройки аутентификации Django.

Ответ №1:

Я нашел решение. Сейчас все работает нормально

customdblogger_views.py

             import socket
            import time
            import logging
            from urllib import request


            class logEngine:

                def logger(self, request):
                    t1 = time.time()
                    params = {'user': request.user.username,
                              'ip_address': socket.gethostbyname(socket.gethostname()),
                              'process_time': time.time() - t1,
                              }
                    return params

                def django_logger(self):
                    django_logger = logging.getLogger('db')
                    return django_logger
 

views.py

             # Create your views here.
            import logging
            import sys

            from rest_framework import status
            from rest_framework.decorators import api_view
            from rest_framework.response import Response
            from rest_framework.views import APIView
            from CustomDBLogger.customdblogger_views import logEngine
            from rest_framework import viewsets, status

            from rest_framework.decorators import action

            db_logger = logging.getLogger('db')


            class Request(viewsets.GenericViewSet):
                attributes = logEngine()

                @action(detail=True)
                def test_api_method(self, request):

                    params2 = {
                        'class_name': __class__.__name__,
                        'method_name': sys._getframe().f_code.co_name,
                        'module_name': __name__,
                    }

                    v1 = self.attributes.logger(request)
                    params2.update(dict(v1))

                    db_logger.info("Successfully entered into function", extra=params2)

                    try:
                        1 / 0
                    except Exception as e:
                        db_logger.exception(e, extra=params2)
                        return Response({'data': True}, status=status.HTTP_200_OK)
                    finally:
                        db_logger.info("exited from the function", extra=params2)