#django #django-rest-framework #jwt #django-rest-framework-jwt
#джанго #django-rest-фреймворк #агентство jwt #django-rest-фреймворк-jwt
Вопрос:
У меня есть проект с аутентификацией JWT в среде Django Rest. Обычно я требую, чтобы пользователь прошел аутентификацию, но в случае действия GET (как список, так и извлечение) Я хотел бы, чтобы все могли получить к нему доступ без необходимости аутентификации.
Код для этой функции очень прост:
class GetUserViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.RetrieveModelMixin): # allowed for everyone serializer_class = UserSerializer permission_classes = [permissions.AllowAny] queryset = User.objects.all()
Разрешения установлены так, чтобы разрешать любые, но, вероятно, существует некоторое несоответствие с классом аутентификации по умолчанию в Settings.py
# --------------------------REST-framework-------------------------- REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticatedOrReadOnly' ], "DEFAULT_AUTHENTICATION_CLASSES": ( "rest_framework_simplejwt.authentication.JWTAuthentication", ), 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', }
Последнее, что может иметь значение, — это мои конечные точки:
urlpatterns = [ path("", UserViewSet.as_view({"post": "create"}), kwargs={'quantity': 1}), path("lt;int:quantitygt;/", UserViewSet.as_view({"post": "create"})), path("", GetUserViewSet.as_view({"get": "list"})), path("lt;int:pkgt;/", GetUserViewSet.as_view({"get": "retrieve"})), path("lt;int:pkgt;/", UserViewSet.as_view({"put": "update", "delete": "destroy"})), ]
Чего я не понимаю, так это того, что в другом приложении, где у меня есть функция регистрации, такой ошибки нет. Я покажу вам этот набор представлений:
class ApiUserViewSet(viewsets.GenericViewSet, mixins.CreateModelMixin): serializer_class = ApiUserSerializer permission_classes = [permissions.AllowAny] queryset = ApiUser.objects.all() @extend_schema(request=ApiUserSerializer, responses=TokenSerializer) def create(self, request, *args, **kwargs): api_user_serializer = self.get_serializer(data=request.data) api_user_serializer.is_valid(raise_exception=True) api_user = api_user_serializer.save() refresh = RefreshToken.for_user(api_user) token_serializer = TokenSerializer( data={ "access": str(refresh.access_token), "refresh": str(refresh) } ) token_serializer.is_valid(raise_exception=True) headers = self.get_success_headers(token_serializer.data) return Response(token_serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Если у вас есть какие-либо идеи, что может быть не так, пожалуйста, дайте мне знать!
Спасибо
Комментарии:
1. Попробуйте удалить разрешение из настроек и задать необходимое разрешение для каждого набора представлений с помощью этой переменной: authentication_classes