Django Rest Framework очень медленно работает с пользовательскими свойствами - PullRequest
0 голосов
/ 25 февраля 2020

Каждый раз, когда я делаю запрос drf для доступа к свойствам пользователя, например:

def StatusView(request):
    current_user = request.user
    if current_user.is_anonymous:
        return HttpResponse("none", content_type="text/plain")
    # return HttpResponse(JsonResponse(Serialize_User(current_user)), content_type="text/plain")
    # tmp = Serialize_User(current_user)
    return HttpResponse("none", content_type="text/plain")

, получение ответа занимает до 10 секунд. Если я закомментирую эту строку if current_user.is_anonymous:, запрос будет мгновенным. То же самое касается tmp = Serialize_User(current_user). Любой доступ пользователя занимает слишком много времени для обработки. Я изучил методы оптимизации, но отключение DEBUG или предварительная выборка не помогают, так как мои модели не включают вложенные модели. Вот моя User модель:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
    is_active = models.BooleanField(_('active'), default=True)
    #avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def get_full_name(self):
        '''
        Returns the first_name plus the last_name, with a space in between.
        '''
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        '''
        Returns the short name for the user.
        '''
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        '''
        Sends an email to this User.
        '''
        send_mail(subject, message, from_email, [self.email], **kwargs)

Есть ли способ решить или отладить эту проблему?

Редактировать: Вот панель профилирования при использовании django панель инструментов отладки для StatusView:


Call    CumTime Per TotTime Per Count
- /debug_toolbar/panels/__init__.py in process_request(165)
10.320  10.320  0.000   0.000   1
- /django/core/handlers/exception.py in inner(31)
10.320  10.320  0.000   0.000   1
- /django/core/handlers/base.py in _get_response(85)
10.320  10.320  0.000   0.000   1
- /var/www/cnmb10a/cnmb10a/rest/auth_api/views.py in StatusView(69)
10.320  10.320  0.000   0.000   1
- /django/utils/functional.py in inner(254)
10.315  10.315  0.000   0.000   1
- /django/utils/functional.py in _setup(391)
10.315  10.315  0.000   0.000   1
- /django/contrib/auth/middleware.py in <lambda>(24)
10.315  10.315  0.000   0.000   1
- /django/contrib/auth/middleware.py in get_user(10)
10.315  10.315  0.000   0.000   1
- /django/contrib/auth/__init__.py in get_user(174)
10.315  10.315  0.000   0.000   1
- /django/contrib/auth/__init__.py in _get_user_session_key(56)
10.221  10.221  0.000   0.000   1
 /django/contrib/sessions/backends/base.py in __getitem__(53)
10.221  10.221  0.000   0.000   1

Edit2: я попытался использовать систему баз данных по умолчанию, поставляемую с django, и она работает нормально, но как только я переключаюсь на базу данных mysql, размещенную на той же самой машина, все запросы, которые обращаются к нему, занимают 10 секунд. Я не знаю, где проблема, так как база данных работает нормально при совершении звонков через обычный php, или phpadmin, или терминал.

...