Restframework 认证authentication 组件实例-1
1. 创建用户表和 token表
class User(models.Model): user =models.CharField(max_length=32) pwd =models.CharField(max_length=32) type=((1,"VIP"),(2,"SVIP"),(1,"SSVIP")) user_type = models.IntegerField(choices=type) class UserToken(models.Model): user= models.OneToOneField("User") token =models.CharField(max_length=128)
2.创建登录类
from app01.models import User,UserToken class LoginView(APIView): """ 1000:成功 1001: 用户名和密码错误 1002:异常错误 """ def post(self,request): response = {"code": 100, "msg": None, "user": None} try: print(request.data) user= request.data.get("user") pwd =request.data.get("pwd") user =User.objects.filter(user=user,pwd=pwd).first() import uuid random_str =uuid.uuid4() if user: response["user"] =user.user UserToken.objects.update_or_create(user =user,defaults={"token":random_str}) response["user"] =user.user response["token"] =random_str else: response["code"]=1001 response["msg"]="密码错误" except Exception as e: response["code"] =1002 response["msg"] =str(e) return Response(response)
3.设置认证类逻辑.
from app01.models import UserToken
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
class UserAuth(BaseAuthentication):
msg = "认证失败"
def authenticate(self, request):
token = request.query_params.get("token")
usertoken= UserToken.objects.filter(token =token).first()
if usertoken:
return usertoken.user, usertoken.token
else:
raise AuthenticationFailed("认证失败!")
4.1 应用局部认证
class BookView(APIView):
authentication_classes = [UserAuth]
def get(self,request):
"""
查看所有书籍
:param request:
:return:
"""
book_list=Book.objects.all()
serializer= BookSerializer(book_list,many=True)
return Response(serializer.data)
def post(self,request):
"""
添加一条书籍
:param request:
:return:
"""
serializer=BookSerializer(data=request.data,many=True)
if serializer.is_valid():
serializer.save()#create操作.
return Response(serializer.data)
else:
return Response(serializer.errors)
4.2 设置全局认证模式
REST_FRAMEWORK={ 'DEFAULT_AUTHENTICATION_CLASSES': ( 'app01.utils.auth_class.UserAuth', ), }
验证.