2016-02-28 135 views
1

我在Django + allauth中有一个后端,restova框架和本地应用程序在cordova/jquery mobile中。我必须访问这个本地应用程序的登录/注销页面。Django,cordova和身份验证

我有点困惑。 我使简单的ajax来测试它。

我加

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

$.ajax({ 
    type : "POST", 
    url : url+"login/", 
    data : {x:'user1', y:"pass1"} 
}) 

我在Django的创建分贝这种模式(用户1,PASS1)

而且我有鉴于在Django

@api_view(['POST']) 
def login(request): 
    username = request.POST.get('x') 
    password = request.POST.get('y') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(user) 
return Response({...}) 

但行

login(user) 

我明白了错误:

AttributeError: 'User' object has no attribute 'encoding' 

当我把后

user = authenticate(username=username, password=password) 
print user 

我得到这个用户“user1的”

窦你们有阿努想法如何正确地做这个登录系统打印?

回答

0

我想通了。只需将函数重命名为“登录”以外的内容即可。

+0

调用'登录信息(用户)'会被递归调用它里面的功能。另外,从进口django.contrib中的auth'进口'将允许调用' auth.login(user)',作为命名空间冲突的替代修复。 –

+0

Plus还没有登录功能需要请求吗? '登录(请求,用户)' – dkarchmer

0

因为我相信你正在使用Django的REST框架,这里是一个基于类的功能登录(如果你想忽略令牌的一面,但我假设你还使用令牌或类似的东西。

class APILoginViewSet(APIView): 
    """ 
    View to list all users in the system. 

    * Requires token authentication. 
    """ 

    @csrf_exempt 
    def post(self, request, format=None): 
     data = JSONParser().parse(request) 
     serializer = LoginCustomSerializer(data=data) 

     if serializer.is_valid(): 
      email = serializer.data.get('email') 
      password = serializer.data.get('password') 

      if not request.user.is_anonymous(): 
       return Response('Already Logged-in', status=status.HTTP_403_FORBIDDEN) 

      account = authenticate(email=email, password=password) 

      if account is not None: 
       if account.is_active: 
        login(request, account) 

        # Add the token to the return serialization 
        try: 
         token = Token.objects.get(user=account) 
        except: 
         token = Token.objects.create(user=account) 

        data = { 
         'token': token.key 
        } 

        return Response(data) 
       else: 
        return Response('This account is not Active.', status=status.HTTP_401_UNAUTHORIZED) 
      else: 
       return Response('Username/password combination invalid.', status=status.HTTP_401_UNAUTHORIZED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

,并在您serializer.py

class LoginCustomSerializer(serializers.Serializer): 
    email = serializers.EmailField(max_length=200) 
    password = serializers.CharField(max_length=200)