############### 表结构 ################
登陆和认证, 每一个接口必须要登陆了才可以访问, 使用token进行登陆认证,和接口访问, 对认证又有了新的认识,权限,频率这三个组件的用法一样, 需要细细体会,
############### 表结构 ################
class UserInfo(models.Model):
user = models.CharField(max_length=32)
pwd = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(to="UserInfo")
token = models.CharField(max_length=64)
############### 登陆认证 ################
from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import HttpResponse
from api import models
import uuid
class AuthView(APIView):
def post(self,request,*args,**kwargs):
"""
用户登录认证
:param request:
:param args:
:param kwargs:
:return:
"""
ret = {'code':1000}
user = request.data.get('user')
pwd = request.data.get('pwd')
user = models.UserInfo.objects.filter(user=user,pwd=pwd).first()
if not user:
ret['code'] = 1001
ret['error'] = '用户名或密码错误'
else:
uid = str(uuid.uuid4())
models.UserToken.objects.update_or_create(user=user,defaults={'token':uid})
ret['token'] = uid
return Response(ret)
############### 访问接口的认证类 ################
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from api import models
class LuffyAuth(BaseAuthentication):
def authenticate(self, request):
"""
认证,需要获取前端传递的token,并且校验是否存在,
:param request:
:return:
"""
token = request.query_params.get('token')
obj = models.UserToken.objects.filter(token=token).first()
if not obj:
raise AuthenticationFailed({'code':1001,'error':'认证失败'})
return (obj.user.user,obj) # 认证成功返回一个元组,
############### 视图认证举例 ################
class MicroView(APIView):
# 认证
authentication_classes = [LuffyAuth,]
def get(self,request,*args,**kwargs):
ret = {'code':1000,'title':'微职位'}
return Response(ret)
############### 表结构 ################
来源:https://www.cnblogs.com/andy0816/p/12302022.html