JWT Логин Django Rest Framework - PullRequest
       44

JWT Логин Django Rest Framework

1 голос
/ 23 марта 2019

Я пытаюсь создать вид входа в систему с помощью djangorestframework-jwt. Когда я зарегистрировал своего пользователя (url 'login /'), все было нормально, и все работало, но и переключился на другую страницу (url 'post_list'), чтобы создать сообщение. Я получил ошибку, что мой пользователь является анонимным, поэтому я решил, что мой пользователь снова не прошел проверку подлинности. Не могли бы вы помочь мне создать правильное представление для входа в JWT, которое позволит мне создавать и переключаться между различными страницами без каких-либо препятствий?

Мои настройки.py:

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ],

    'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
}

Мои сериализаторы:

class TokenSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=128)
    password = serializers.CharField(write_only=True,
                                     required=True,
                                     style={
                                         'input_type': 'password',
                                         'placeholder': 'password'
                                     })


class PostSerializer(serializers.ModelSerializer):
    created_by = serializers.ReadOnlyField(source='created_by.username')

    class Meta:
        model = Post
        fields = '__all__'

Мои взгляды:

class UserLogin(generics.CreateAPIView):
    """
    POST login/
    """
    permission_classes = (permissions.AllowAny,)
    queryset = User.objects.all()
    serializer_class = TokenSerializer

    def post(self, request, *args, **kwargs):
        username = request.data.get("username", "")
        password = request.data.get("password", "")

        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return Response({
                "token": jwt_encode_handler(jwt_payload_handler(user)),
                'username': username,
            }, status=200)
        return Response(status=status.HTTP_401_UNAUTHORIZED)


class PostView(generics.ListCreateAPIView):
    """
        POST, GET post_list/
    """

    serializer_class = PostSerializer
    queryset = Post.objects.all()

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

    permission_classes = (permissions.IsAuthenticatedOrReadOnly, )

URLS:

urlpatterns = [
    url(r'^register/$', UserRegistration.as_view(), name='registration'),
    url(r'^login/$', UserLogin.as_view(), name='user_login'),
    url(r'^post_list/$', PostView.as_view(), name='post_list'),
]
...