标签: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)
""" 源码: 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()
标签:click defaults imp cascade ida update initial ror hid
原文地址:https://www.cnblogs.com/wt7018/p/11468717.html