我试图使当前用户对象可用,以便我的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)。