Django Rest Framework и Auth: как переопределить UserDetailsView - PullRequest
1 голос
/ 24 июня 2019

Я использую django-rest-auth для конечных точек API для моей пользовательской модели.Получая информацию о пользователе, я отправляю запрос GET на /rest-auth/user/.Это хорошо работает с аутентифицированным пользователем, но запрещено для неаутентифицированного пользователя, отмеченного ошибкой 403 Forbidden.

Однако я хочу, чтобы другие пользователи могли просматривать детали друг друга.Как я могу это изменить?

Этот тест демонстрирует эту ошибку:

def test_get_user(self):
        # /rest-auth/user/ (GET)
        # params: username, first_name, last_name
        # returns: pk, username, email, first_name, last_name
        client = APIClient()
        client.login(username=self.user2.username, 
                     password=self.user2.password)

        path = "/rest-auth/user/"
        user_data = {
            "username": self.username,
        }
        expected_response = {
            "pk": self.id,
            "username": self.username,
            "email": self.email,
            "first_name": '',
            "last_name": '',
        }

        response = client.get(path, user_data)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, expected_response)

РЕДАКТИРОВАТЬ: я пытался переопределить разрешения UserDetailsView, но мне не удалось сделать это должным образом.Как мне сделать это правильно?

from rest_auth import views
from rest_framework.permissions import IsAuthenticatedOrReadOnly


class CustomUserDetailsView(views.UserDetailsView):
    permission_classes = (IsAuthenticatedOrReadOnly, )

1 Ответ

1 голос
/ 24 июня 2019

django-rest-auth /rest-auth/user/ позволяет получать данные только аутентифицированного пользователя.

class UserDetailsView(RetrieveUpdateAPIView):
"""
Reads and updates UserModel fields
Accepts GET, PUT, PATCH methods.

Default accepted fields: username, first_name, last_name
Default display fields: pk, username, email, first_name, last_name
Read-only fields: pk, email

Returns UserModel fields.
"""
serializer_class = UserDetailsSerializer
permission_classes = (IsAuthenticated,)

def get_object(self):
    return self.request.user

def get_queryset(self):
    """
    Adding this method since it is sometimes called when using
    django-rest-swagger
    https://github.com/Tivix/django-rest-auth/issues/275
    """
    return get_user_model().objects.all()

, если вы хотите, чтобы неаутентифицированные пользователи читали все объекты пользователя, которые вы записаливаш собственный вид.

serializers.py

User = get_user_model()
class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = "__all__"

views.py

class UserDetailApiView(generics.RetrieveAPIView):
permission_classes = (IsAuthenticatedOrReadOnly,)
queryset = get_user_model().objects.all()
serializer_class = UserSerializer

urls.py

path('api/users/<int:pk>',views.UserDetailApiView.as_view(),name='user')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...