rstJkee
@rstJkee

AnonymousUser при каждом запросе (simplejwt)?

У меня есть расширенная модель юзера

class ExtUser(AbstractUser):
    avatar = models.ImageField(upload_to=upload_to, verbose_name="Аватар", blank=True, null=True, default=None)
    discord = models.CharField(max_length=32, verbose_name="Discord", blank=True, null=True, default=None)
    skype = models.CharField(max_length=64, verbose_name="Skype", blank=True, null=True, default=None)
    REQUIRED_FIELDS = ["password", "email"]
    USERNAME_FIELD = "username"


В settings.py указаны все данные
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'SEARCH_PARAM': 'q',
    'ORDERING_PARAM': 'ordered_by',
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ],
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
    ],
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=10) if DEBUG else timedelta(minutes=10),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=30) if DEBUG else timedelta(days=5),
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',)
}

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'drf_yasg',
    'rest_framework',
    'django_filters',
    'corsheaders',
    'ident_system.apps.IdentSystemConfig',
    'tags.apps.TagsConfig',
    'user_space.apps.UserSpaceConfig',
    'courses.apps.CoursesConfig',
    'rest_framework_simplejwt',
]

AUTH_USER_MODEL = "user_space.ExtUser"


Во views.py где рега и авторизация тоже вроде всё в порядке
class SignUp(CreateAPIView):
    queryset = User.objects.all()
    permission_classes = [permissions.AllowAny]
    serializer_class = SignUpSerializer

    def post(self, request, *args, **kwargs):
        try:
            user = User.objects.create_user(**request.data)
            group = Group.objects.get(name="user")
            group.user_set.add(user)
        except Exception as e:
            return Response({"detail": "Пользователь с таким именем уже существует"}, status=status.HTTP_409_CONFLICT)
        return Response(status=status.HTTP_201_CREATED)


class JWTLogIn(TokenObtainPairView):
    serializer_class = ExtendedTokenSerializer
    permission_classes = [permissions.AllowAny]


Сериалайзер к токену
class ExtendedTokenSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        return RefreshToken.for_user(user)

    def validate(self, attrs):
        data = super().validate(attrs)
        token = self.get_token(self.user)
        data["refresh"] = str(token)
        data["access"] = str(token.access_token)
        if len(self.user.groups.all()) == 0:
            if self.user.is_superuser:
                group = Group.objects.get(name="admin")
            elif self.user.is_staff:
                group = Group.objects.get(name="moderator")
            else:
                group = Group.objects.get(name="user")
            group.user_set.add(self.user)
        data["user"] = UserSerializer(self.user).data
        return data


Что пошло не так?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
rstJkee
@rstJkee Автор вопроса
А, очень весело получилось, я, собственно, чего-то не знал видимо или что-то просмотрел. У меня используется ModelViewSet, весь код вот
class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.filter(is_deleted=False)
    serializer_class = CourseSerializer
    swagger_tags = ["Course"]

    def create(self, request, *args, **kwargs):
        data = request.data
        course = Course.objects.create(
            name=data["name"],
            description=data["description"],
            information=data["information"],
            author_id=data["author"]
        )
        course.save()
        tags = set(data["tags"])
        for tag in tags:
            created_tag = Tags.objects.get_or_create(name=tag)[0]
            course.tags.add(created_tag.id)
        return Response(status=status.HTTP_201_CREATED)

    def partial_update(self, request, *args, **kwargs):
        course = Course.objects.get(id=int(kwargs["pk"]))
        if request.user.id == course.author.id:
            return super().partial_update(request, *args, **kwargs)
        return Response(status=status.HTTP_403_FORBIDDEN)

Не важно, что он делает, важно, что при добавлении
authentication_classes = [JWTAuthentication]
всё начинает работать. При том, что в rest_framework указан дефолтный класс, тут всё равно надо указывать его...
То есть окончательно класс сейчас выглядит так
class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.filter(is_deleted=False)
    serializer_class = CourseSerializer
    authentication_classes = [JWTAuthentication]
    swagger_tags = ["Course"]
    ...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы