一认证
我们可以想想, 我们要访问一个页面, 需不需要对其进行认证, 希望进入页面的时候看到哪些内容, 一般是根据用户的不同而不同
首先, 我们先设计一个表, 如何知道对方通过了验证, 我们可以考虑给其加一个 token, 并且每个人都有不同的权限 (大小)
- #models.py
- from django.db import models
- class UserInfo(models.Model):
- user_type_choices=(
- (1,'普通用户'),
- (2,'VIP'),
- (3,"SVIP")
- )
- user_type=models.IntegerField(choices=user_type_choices)
- username=models.CharField(max_length=32,unique=True)
- password=models.CharField(max_length=32)
- class UserToken(models.Model):
- user=models.OneToOneField(to='UserInfo') #默认就是 UserInfo 表的 id
- token=models.CharField(max_length=64)
其次, 需要设计 token,token 一般是一长串字符串, 我们可以使用 md5 对其进行转化
- #views.py
- def md5(user):
- import hashlib,time
- ctime=str(time.time())
- m=hashlib.md5(bytes(user,encoding='utf-8')) #使用 bytes 方法直接让 str 变成 bytes
- m.update(bytes(ctime,encoding='utf-8'))
- return m.hexdigest()
设计验证方法
- #views.py
- from rest_framework.views import exceptions
- from API import models
- from rest_framework.authentication import BaseAuthentication
- #BaseAuthentication 类强制要求重写 authenticate 函数, 要不然抛出异常 .authenticate() must be overridden
- class Auth_yanzheng(BaseAuthentication):
- def authenticate(self, request):
- token = request._request.GET.get('token')
- token_obj = models.UserToken.objects.filter(token=token).first()
- if not token_obj:
- raise exceptions.AuthenticationFailed('用户认证失败')
- # 在 REST framework 内部将两个字段赋值给 request, 以供后续操作使用
- return (token_obj.user, token_obj) #返回元组
- def authenticate_header(self, request): #这个要写要不然报错
- pass
token 从哪里获得? 当然是用户登录的时候
- #views.py
- class AuthView(APIView): #根据用户登录, 找出 token, 有就更新, 没有就新建 def post(self,request,*args,**kwargs):
- ret={'code':1000,'msg':None}
- try:
- user=request._request.POST.get('username')
- pwd=request._request.POST.get('password')
- obj=models.UserInfo.objects.filter(username=user,password=pwd).first()
- if not obj:
- ret['code']=1001
- ret['msg']='用户名或密码错误'
- token=md5(user)
- models.UserToken.objects.update_or_create(user=obj,defaults={'token':token}) #注意 update_or_create 方法
- ret['token']=token
- except Exception as e:
- print(e)
- ret['code']=1002
- ret['msg']='请求异常'
- return JsonResponse(ret)
下面通过 postman 来实现这一过程
下面, 我们来设计另外一个函数, 用上我们的认证
- ORDER_DICT={
- 1:{
- 'name':"hehe",
- 'age':18,
- 'gender':'男',
- 'content':"..."
- },
- 2: {
- 'name': "go",
- 'age': 19,
- 'gender': '男',
- 'content': "..."
- }
- }
- class OrderView(APIView):
- authentication_classes = [Auth_yanzheng]
- def get(self,request,*args,**kwargs):
- # token=request._request.GET.get('token')
- # if not token:
- # return HttpResponse('用户未登录')
- ret={'code':1000,'msg':None,'data':None}
- try:
- ret['data']=ORDER_DICT #ORDER_DICT 是我们给成功认证的用户看的东西
- except Exception as e:
- pass
- return JsonResponse(ret)
来源: http://www.bubuko.com/infodetail-3093441.html