Используйте другой сериализатор в зависимости от метода аутентификации в django rest framework
Я пытаюсь реализовать профиль пользователя в django остальные рамки.
Пользователи должны иметь возможность запрашивать профиль других пользователей; однако, поскольку профили содержат конфиденциальную информацию, я хочу ограничить информацию, возвращаемую не владельцам и не прошедшим проверку подлинности пользователям, когда они запрашивают профиль.
Я ищу тест, который я могу запустить в моих методах представления, которые определят, какой сериализатор использовать для этого запроса.
Как я могу это сделать?
# models.py
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile')
bio = models.CharField(max_length=100)
# dob is sensitive and should be protected...
dob = models.DateTimeField(blank=True, null=True)
Мои сериализаторы будут выглядеть так:
# serializers.py
# Only for the owner...
class ProfileOwnerSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.id')
first_name = serializers.ReadOnlyField(source='user.first_name')
last_name = serializers.ReadOnlyField(source='user.last_name')
class Meta:
model = Profile
fields = (
'url',
'id',
'dob', #sensitive
'user',
'first_name',
'last_name', #sensitive
)
#For logged in users...
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.id')
first_name = serializers.ReadOnlyField(source='user.first_name')
class Meta:
model = Profile
fields = (
'url',
'id',
'bio',
'user',
'first_name',
)
#For everyone else...
class NonAuthProfileSerializer:
...
И я бы попытался различить их здесь...
# views.py
class ProfileDetail(APIView):
"""
Retrieve a profile instance.
"""
# Can't user permission_classes bc I want to cater to different classes...
def get_object(self, pk):
try:
return Profile.objects.get(pk=pk)
except Profile.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
profile = self.get_object(pk)
# is_owner = ???
# is_authenticated = ???
# Define the serializer to be ProfileSerializer, ProfileOwnerSerializer, etc.
serializer = CorrectSerializer(
profile,
context={"request": request},
)
return Response(serializer.data)
Я не думаю, что было бы слишком сложно проверить, был ли запрос отправлен владельцем, поскольку я могу просто дать перекрестную ссылку на идентификатор профиля.
Однако как я могу проверить, вошел ли пользователь в систему или нет? Я пытался смотреть на request.user.auth
в методе представления, но это, кажется, None
независимо от того, вошел ли запрос в систему.
1 ответ
Я думаю, что вы должны проверить с request.user.is_authenticated()
, Чтобы заполнить пробелы:
is_owner = profile.user == request.user
is_authenticated = request.user.is_authenticated()