码迷,mamicode.com
首页 > 其他好文 > 详细

restframework 认证

时间:2019-09-05 18:44:34      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:click   defaults   imp   cascade   ida   update   initial   ror   hid   

 

技术图片
class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=64)

    def __str__(self):
        return self.name


class Token(models.Model):
    users = models.OneToOneField(to="User", on_delete=models.CASCADE)
    token = models.CharField(max_length=128)

    def __str__(self):
        return self.token
模型

 

技术图片
def get_random_str(user):
    import hashlib
    import time
    md5 = hashlib.md5(bytes(user, encoding=utf-8))
    md5.update(bytes(str(time.time()), encoding=utf-8))
    return md5.hexdigest()


class LoginView(APIView):
    def post(self, request):
        res = {status_code: 2000, msg: None}
        name = request.data.get(name)
        pwd = request.data.get(pwd)
        user_obj = User.objects.filter(name=name, pwd=pwd).first()
        if user_obj:
            token = get_random_str(user_obj.name)
            Token.objects.update_or_create(users=user_obj, defaults={token: token})
            res[token] = token
        else:
            res[status_code] = 1001
            res[msg] = "账号或密码错误"
        return JsonResponse(res)
view 设置Token

 

技术图片
"""
源码:
1.authentication_classes
APIView 中的 dispath() -> initial找到user静态方法 ->initialize_request->Request(找到静态方法user)->_authenticate()查找 authenticators->authenticators=self.get_authenticators()->authentication_classes
2.authenticate(self)
authenticators 是实例化对象的列表
authenticator 对象
authenticator
authenticate(self) 方法 self 是request
"""
class TestToken:
    def authenticate(self, request):
        token = request.GET.get(token)
        # print("==============>", token)
        token_obj = Token.objects.filter(token=token).first()
        if token_obj:
            return token_obj.users.name, token_obj.token
        else:
            raise exceptions.ValidationError(token错误)


class PublishView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    authentication_classes = [TestToken]
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


from rest_framework.response import Response


class PublishDetailView(APIView):
    authentication_classes = [TestToken]
    def get(self, request, pk):
        publish_obj = Publish.objects.filter(pk=pk).first()
        ps = PublishSerializer(publish_obj, many=False)
        return Response(ps.data)

    def put(self, request, pk):
        public_obj = Publish.objects.filter(pk=pk).first()
        ps = PublishSerializer(public_obj, data=request.data)
        if ps.is_valid():
            ps.save()
            # print(ps.data)
            return Response(ps.data)
        else:
            return Response(ps.errors)

    def delete(self, request, pk):
        Publish.objects.filter(pk=pk).delete()
        return Response()
认证方法1

 

restframework 认证

标签:click   defaults   imp   cascade   ida   update   initial   ror   hid   

原文地址:https://www.cnblogs.com/wt7018/p/11468717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!