Как разрешить анонимные почтовые запросы, но запретить несанкционированные запросы на получение в django? - PullRequest
1 голос
/ 09 апреля 2020

В C# вы можете легко прикрепить [AllowAnonymous] к запросу, чтобы можно было использовать указанный метод c. Однако в django я немного путаюсь с представлениями, сериализаторами, ...

Правильно ли я понимаю, что ViewSet позволяет вам увидеть, что содержит определенный класс Serializer? Если это так, я бы хотел, чтобы это было скрыто от пользователей.

class UserViewSet(viewsets.ModelViewSet):

    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

Вот как я это реализовал, и он работает просто отлично. Поэтому, когда я go до http://127.0.0.1: 8000 / api / users / я получаю сообщение об ошибке, что я не аутентифицирован.

Теперь проблема заключается в регистрации нового пользователя.

class UserSerializer(serializers.ModelSerializer):

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

    def create(self, validated_data, AllowAny):
        user = User.objects.create_user(**validated_data)
        return user

Когда я нажимаю http://127.0.0.1: 8000 / api / users / с запросом на публикацию в моем приложении Angular с недавно зарегистрированной userData, я, очевидно, получаю ошибку аутентификации.

Как я могу решить, что мне или кому-либо с недостаточными правами не разрешено ВИДЕТЬ данные пользователей, но, тем не менее, каждый может создать (опубликовать) нового пользователя?

1 Ответ

3 голосов
/ 09 апреля 2020

Переопределите ваш get_permissions(...) метод ModelViewSet as,

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    authentication_classes = (TokenAuthentication,)
    <b>permission_classes = (IsAuthenticated,) # default permission class for this view</b>

    <b>def get_permissions(self):
        if self.request.method == 'POST':
            return []
        return super().get_permissions()</b>
...