Dijango Rest Framework - pełne dane użytkownika po zalogowaniu

Odpowiedz Nowy wątek
2018-04-07 22:08
0

Witam,

Mam pytanie do bardziej doświadczonych użytkowników. Mianowicie potrzebuję uzyskać w odpowiedzi na zalogowanie dane użytkownika logującego się.
Niestety jestem zbyt zielony i nie wiem od czego się zabrać. Podejrzewam, że jest to prosta rzecz a jednak sprawia mi problem.

oto fragment kodu z views.py, oraz fragment z serializatora

class UserLoginView(APIView):

    renderer_class = (JSONRenderer, BrowsableAPIRenderer,)
    permission_classes = (permissions.AllowAny, )
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            auth.login(request, User.objects.get(username=data['username']))
            return Response(new_data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class UserRegistrationSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)
    email = serializers.EmailField(
            required=True,
            validators=[UniqueValidator(queryset=User.objects.all())]
            )
    username = serializers.CharField(
            required=True,
            validators=[UniqueValidator(queryset=User.objects.all())]
            )
    password = serializers.CharField(min_length=8)
    password_confirmation = serializers.CharField(required=True)

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'password', 'password_confirmation', 'email',]
        extra_kwargs = {"password":{"write_only":True}}

    def validate(self, data):
        passwd = data['password']
        passwd_confirm = data['password_confirmation']
        if not passwd == passwd_confirm:
            raise serializers.ValidationError("Passwords are not the same!")
        return data

    def create(self, validated_data):
        user = User.objects.create_user(validated_data['username'], validated_data['email'])
        user.set_password(validated_data['password'])
        setattr(user, 'first_name', validated_data['first_name'])
        setattr(user, 'last_name', validated_data['last_name'])
        user.save()
        return user

class UserLoginSerializer(serializers.ModelSerializer):
    username = serializers.CharField()

    class Meta:
        model = User
        fields = ['username', 'password']
        extra_kwargs = {"password":{"write_only":True}}

    def validate(self, data):
        user = auth.authenticate(username=data['username'], password=data['password'])
        if not user:
            raise serializers.ValidationError("Username or password is invalid!")
        if not user.is_active:
            raise serializers.ValidationError("This user is inactive!")
        return data

Z góry dzięki za każdą podpowiedź!

Pozostało 580 znaków

2018-04-08 11:17
0

W widoku UserLoginView używasz serializera UserLoginSerializer. Ten serializer ma pola ['username', 'password']. i je w Responsie zwracasz nie?
Możesz w tym widoku wyszukać w bazie użytkownika o tym username i zwrócić jego obiekt, user = User.objects.get(username='username')
albo użyć metody str w modelu i tam wypisał byś pola, które chciał byś zwracać, i wtedy zwracasz w Responsie user zamiast new_data

Pozostało 580 znaków

2018-04-08 14:35
0

W taki sposób rest zwraca mi błąd. Coś robię źle?

def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            #new_data = serializer.data
            user = User.objects.get(username='username', first_name='first_name')
            auth.login(request, User.objects.get(username=data['username']))
            return Response(user, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
edytowany 1x, ostatnio: toom16, 2018-04-08 14:36
zakomentowałeś new_data, odkomentuj to i username i firstname musisz wziac z new_data, bo skad program bedzie mial ich wartosci? - Pes2009 2018-04-08 20:28

Pozostało 580 znaków

2018-04-08 20:42
0
def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            #new_data = serializer.data
            user = User.objects.get(username=data['username'])
            auth.login(request, user)
            return Response(user, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Pozostało 580 znaków

2018-04-08 20:58
0

W ten sposób też próbowałem wcześniej, ale dostaję błąd z JSONami:

Sorry zapomniałem, zrób serializer z fields które chcesz zwrócić. - Pes2009 2018-04-08 22:46

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0