Действие viewset Django не видит добавленные данные запроса в промежуточном программном обеспечении - PullRequest
0 голосов
/ 15 мая 2019

У меня очень странная проблема. Я написал промежуточное программное обеспечение, которое исправляет объект запроса с пользовательским свойством. И это отлично работает во всем проекте, кроме 1 действия. Вот они:
Middleware

class AssignSelectedProfileMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        headers = request.META

        if not request.user.is_anonymous:
            if headers.get(HEADER_PROFILE):
                profile = Profile.objects.filter(pk=headers.get(HEADER_PROFILE),
                                                 archived=False,
                                                 user=request.user).first()
            else:
                profile = Profile.objects.filter(user=request.user).first()
            if not profile:
                raise MyProfileAuthorizationError("You are not allowed to use this profile.")
            setattr(request, "user", request.user._wrapped)
            setattr(request.user, "profile", profile)
        response = self.get_response(request)
        return response

Действие

@action(
        methods=['get', 'patch'],
        detail=False,
        permission_classes=(IsAuthenticated,),
        serializer_class=SafeProfileSerializer,
    )
    def me(self, request):
        return Response(self.get_serializer(self.request.user.profile).data, status.HTTP_200_OK)

Когда я делаю ответ - я вижу, что запрос успешно исправлен в промежуточном программном обеспечении, объект профиля существует, но когда я отлаживаю запрос в представлении - self.request.user.profile выдает AttributeError: 'User' object has no attribute 'profile'. Примечание: другие действия в наборе сохранения сохраняются и user.profile существует. Почему это происходит?

РЕДАКТИРОВАТЬ 1: Печать в промежуточном программном обеспечении и действия:

Middleware: {'_state': <django.db.models.base.ModelState object at 0x7f9e04b04908>, 'id': 1, 'password': 'pbkdf2_sha256$120000$Wxoqm8SATZWk$wVM5uRknaCig+nU7tlY4iQnkwgvJDavdHQHpKBRIstw=', 'last_login': datetime.datetime(2019, 5, 15, 9, 11, 36, 296195), 'is_superuser': False, 'username': 'username0', 'first_name': 'Benjamin', 'last_name': 'Allen', 'email': 'williamsdaniel@hotmail.com', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 5, 15, 9, 11, 35, 808270), 'profile': <Profile: Benjamin Allen, administrator: False>}

View:  {'_state': <django.db.models.base.ModelState object at 0x7f9e04b10358>, 'id': 1, 'password': 'pbkdf2_sha256$120000$Wxoqm8SATZWk$wVM5uRknaCig+nU7tlY4iQnkwgvJDavdHQHpKBRIstw=', 'last_login': datetime.datetime(2019, 5, 15, 9, 11, 36, 296195), 'is_superuser': False, 'username': 'username0', 'first_name': 'Benjamin', 'last_name': 'Allen', 'email': 'williamsdaniel@hotmail.com', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 5, 15, 9, 11, 35, 808270)}

РЕДАКТИРОВАТЬ 2:
Если я добавлю в промежуточное программное обеспечение что-то вроде этого:

if request.path_info == '/api/users/me/':
    setattr(request, "me_action_profile", profile)

И назовите это в действии так:

return Response(self.get_serializer(self.request.me_action_profile).data, status.HTTP_200_OK)

Это работает. Но почему я не могу исправить объект user в этом конкретном случае?

...