认证组件
认证组件使用步骤(固定用法)
1 写一个类,继承BaseAuthentication
2 在类中写:authenticate
3 在方法中,完成登录认证,如果 不是登录的,抛异常
4 如果是登录的,返回登录用户和token
5 在视图类中,使用认证类(局部使用)
class BookView(APIView):
authentication_classes = [LoginAuth, ]
6 全局使用:
# 全局使用
### 重点:不要在配置文件中,导入莫名其妙的包
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'app01.auth.LoginAuth'
],}
7 全局使用后,局部禁用
class UserView(ViewSet):
# 局部禁用
authentication_classes = []
8 认证类的使用顺序
-优先用视图类配置的
-其次用项目配置文件
-最后用drf默认的配置
# 小重点;一旦通过认证,在request中就有当前登录用户
def get(self, request):
# 一旦通过认证,在request中就有当前登录用户
print(request.user.name,'访问了接口')
登录部分代码
from rest_framework.viewsets import ViewSet
import uuid
class UserView(ViewSet):authentication_classes = [Actions, ] #认证@action(methods=['POST'],detail=False)def login(self,request):username=request.data.get('username')password=request.data.get('password')# token=request.MITA.get('HTTP_TOKEN')user=models.User.objects.filter(username=username,password=password).first()if user:token=str(uuid.uuid4())models.UserToken.objects.update_or_create(user_id=user.id,defaults={'token':token})return Response({'code':100,"msg":'登陆成功','token':token})return Response({'code':101,"msg":'用户名或密码错误'})
models.UserToken.objects.update_or_create(user_id=user.id,defaults={'token':token})user_id=user.id根据这个条件去数据库中查询,没有查询到,就根据defaults={'token':token})
重新创建,查询到了,和defaults={'token':token})不一样,就更新
认证类
class Actions(BaseAuthentication):def authenticate(self, request):token = request.query_params.get('token')print(token)user_token = models.UserToken.objects.filter(token=token).first()if user_token:user=user_token.user # 当前登录用户就是userreturn user, tokenelse:raise AuthenticationFailed('认证不通过')