Unabe从DRF get-token api获取令牌

时间:2016-07-12 13:27:41

标签: django django-models django-views django-rest-framework

我的自定义注册api

from rest_framework import viewsets
from rest_framework import serializers

class SignupSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    password = serializers.CharField(required=True, write_only=True)

    def validate_email(self, val):
        try:
            User.objects.get(username=val)
            raise serializers.ValidationError("Email-ID already Exist")
        except User.DoesNotExist:
            return val

class SignupView(viewsets.ModelViewSet):

    serializer_class = SignupSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        data = serializer.data

        email = data.get('email')
        password = data.get('password')

        u = User(email=email, username=email)
        u.set_password(password)
        u.save()

        data = {
            'message': 'Successfully Created!',
            'data': {'id': u.id, 'email': email},
        }
        return Response(data)

Toekn得到api

from rest_framework.authtoken import views
urlpatterns = [
    url(r'^api-token-auth/', views.obtain_auth_token),
]

当我点击signup api时,它会返回成功回复,我的意思是

  

{       'message':'成功创建!',       'data':{'id':1,'email':'xyz @ gmail.com'}}

但是当我尝试使用上面的令牌API为这个用户生成/获取令牌时,它会说..无效的凭据?

{
  "non_field_errors": [
    "Unable to log in with provided credentials."
  ]
}

但是,如果我使用管理命令creationuperuser创建用户并使用相同的api来获取令牌吗?

注册api有什么问题吗?

2 个答案:

答案 0 :(得分:1)

您应该从序列化程序中删除write_only=True。这将解决错误。

答案 1 :(得分:0)

错误消息实际上告诉您,您的请求无法访问该视图,这是因为其中一个中间件引发了错误。

最简单(但不太安全)的解决方案是在成功注册时返回API令牌,或添加另一个带登录名的View(返回令牌)。

要获得明确答案,您需要提供更多信息,例如身份验证后端的配置。

您可以在这里找到更多关于DRF认证的信息 http://www.django-rest-framework.org/api-guide/authentication/#how-authentication-is-determined