首页 > 解决方案 > 如何检查当前用户是否登录 django rest 框架?如何通知其他 django 应用程序当前用户已登录?

问题描述

ListCreateAPIView用于POST and GET requests. 我想检查当前用户是否登录了 GET 请求。如何在 GET 方法中获取当前用户(如果他已登录)?为了使它工作,我必须使用令牌发送,这不是我想要的,因为如果用户注销,用户将无法访问 listView。我以为 django 发出信号,或者重写授权。

我以为是django信号,还是重写Permissions或Authorization。

class PropertyList(generics.ListCreateAPIView):
    """To create a property"""
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, ]
    queryset = Property.objects.filter(published=True)
    serializer_class = PropertySerializer
    filterset_class = PropertyFilter
    pagination_class = LimitOffsetPagination

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

    # for _ in range(100):
    #      logger.info("Your log message is here")

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['is_create'] = True
        print(self.request.user)

        if self.request.user.is_authenticated:
            print(self.request.user)
            current_user = self.request.user
            context['user_favs'] =  (Bookmark.objects.filter(
                bookUser = current_user
            ).values(
                ))
        else:
            context['user_favs'] = False

        return context

在 get_serializer_context(self) 中,我想获取当前用户,因为我返回用户已添加书签的属性。我需要在我的 Get 请求中添加令牌以拥有当前用户,但这意味着,我们必须登录才能查看属性,这不是我想要的

设置

REST_FRAMEWORK = {
    "DATE_INPUT_FORMATS": ["%d-%m-%Y"],
    # 'DATETIME_FORMAT': "%d-%m-%Y %H:%M:%S",
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        # 'rest_framework_simplejwt.authentication.JWTAuthentication',

    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
    'EXCEPTION_HANDLER': 'dooba.utils.custom_exception_handler',
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    # 'DEFAULT_PARSER_CLASSES': (
    #     'rest_framework.parsers.JSONParser',
    #     'rest_framework.parsers.FormParser',
    #     'rest_framework.parsers.MultiPartParser',
    # )

}

如你看到的在此处输入图像描述

在此处输入图像描述

标签: django-rest-framework

解决方案


self.request.user如果没有登录用户,您可以在 APIView 方法中访问用户对象,它应该是AnonymousUser,否则您应该获取登录用户。

编辑:进一步的研究表明,当您使用 JSONWebTokenAuthentication 和 IsAuthenticatedOrReadOnly 时,即使您发出 GET 请求,也会返回带有过期令牌的 401。我建议您在向视图发出 GET 请求时不要PropertyList放置 Authenticate 标头,这将解决您的问题。


推荐阅读