我试图使当前用户对象可用,以便我的AJAX前端可以确定用户是否已登录。

对于已登录人员,当前用户是dajngo.contrib.auth.User的实例,对于未登录人员,当前用户是AnonymousUser的实例。序列化器如下,

class UserSerializer(serializers.HyperlinkedModelSerializer):
    comments = serializers.HyperlinkedRelatedField(many = True, view_name = 'comment-detail')
    class Meta:
        model = User
        fields = ('url', 'username', 'comments', 'first_name', 'last_name')


具有以下视图

class CurrentUserView(APIView):
    '''
    Returns the current user, logged in or not
    '''
    def get(self, request, *args, **kwargs):
        serializer = serializers.UserSerializer(request.user)
        return Response(serializer.data)


这个序列化程序对于已登录的用户来说很好用,即在“ comments”字段上打补丁并发送出去。但是,对于AnonymousUser,它会窒息。它声称没有方法“ comments”(没有,但是应该在右边打补丁吗?),如果我从fields中删除​​了“ comments”要求,那么它将抱怨没有“ first_name”。

这不是AnonymousUser实例的问题,这是问题吗?如果是这样,我该如何补救?

我意识到我可以在View级别检查并返回自定义数据对象(如果它是django.contrib.auth.User的实例),但是有没有更整齐的方法呢?

最佳答案

最好像这样进行序列化,将身份验证检查移至后端(它属于该后端):

{
    'is_logged_in': True,
    'user': <<serialized user>>,
}


和:

{
    'is_logged_in': False,
    'user': None, # or something else like this
}


这是许多API中的通用解决方案。元数据位于JSON之上,可能的对象位于一个键下。您可以通过检查.is_authenticated()来检查用户是AnonymousUser还是User-它是专门为此目的创建的(与:
AnonymousUser)。

09-28 11:06