如何检查当前用户是否已登录django rest框架?如何通知其他Django应用程序当前用户已登录?

时间:2019-07-31 08:48:39

标签: django-rest-framework

我将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',
    # )

}

您会看到enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

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

编辑:此外,research透露,当您将JSONWebTokenAuthentication与IsAuthenticatedOrReadOnly一起使用时,即使您发出GET请求,也将返回带有过期令牌的401 。我建议您在向PropertyList视图发送GET请求时从不放置Authenticate标头,这样可以解决您的问题。