博客五部曲之三 - 博客RESTful


1405 浏览 5 years, 2 months

28 Base APIView for User Login

版权声明: 转载请注明出处 http://www.codingsoho.com/

Base APIView for User Login

接下来实现用户登陆。在用户登陆中,我们打算引入token来验证登陆。

src/accounts/api/serializers.py

from rest_framework.serializers import (
     CharField,

class UserLoginSerializer(ModelSerializer):
     token = CharField(allow_blank=True, read_only=True)
     username = CharField()
     email = EmailField(label='Email Address')
     class Meta:
         model = User
         fields = [
             'username',
             'email',
             'password',
             'token',
         ]
         extra_kwargs = {"password":
                             {"write_only": True}
                             }
     def validate(self, data):
         # email = data['email']
         # user_qs = User.objects.filter(email=email)
         # if user_qs.exists():
         #     raise ValidationError("This user has already registered.")
         return data

视图里post验证的过程跟form验证有的类似,首先通过Serializer获取数据,并且做验证is_valid,如果验证失败,那么Response错误(TTP_400_BAD_REQUEST),注意这儿的Response是RESTful的响应,不是HttpResponse。如果验证成功,那么正常处理,返回TTP_200_OK.

src/accounts/api/views.py

from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK, HTTP_400_BAD_REQUEST
from rest_framework.views import APIView

from .serializers import (
     UserLoginSerializer, 

class UserLoginAPIView(APIView):
     permission_classes = [AllowAny]
     serializer_class = UserLoginSerializer     
     def post(self, request, *args, **kwargs):
         data = request.data
         serializer = UserLoginSerializer(data=data)
         if serializer.is_valid(raise_exception=True):
             new_data = serializer.data
             return Response(new_data, status=HTTP_200_OK)
         return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

最后,添加到URL

src/accounts/api/urls.py

from .views import (
     UserLoginAPIView        

urlpatterns = [
     url(r'^login/$', UserLoginAPIView.as_view(), name='login'),

访问http://127.0.0.1:8000/api/users/login/,当前还只是做了数据的格式验证,下一节会对数据有效性进行验证。