django框架休息用户认证

  
 <代码> BaseAuthentication类:
  django框架休息通过BaseAuthentication实现认证功能
  无论是自定义的认证类还是rest框架自带的认证类都应该继承BaseAuthentication
  BaseAuthentication中有两个方法验证和authenticate_header,其中验证方法必须实现
  如果用户需要自定义认证方法则继承BaseAuthentication重写验证方法即可 
  



models.py

  
 <代码> django。数据库导入模型
  类用户信息(models.Model):
  user_type_choices=(
  (1,'普通用户”),
  (2、“新品”),
  “SVPI”(3),
  )
  user_type=models.IntegerField(选择=user_type_choices)
  用户名=模型。CharField (max_length=32,惟一=True)
  密码=models.CharField (max_length=64)
  
  类UserToken (models.Model):
  用户=模型。一对一字段(“用户信息”,models.CASCADE)
  令牌=models.CharField (max_length=64)  
  



APP_DIR/跑龙套/身份验证。py #在和观点。py同级的目录创建跑龙套包,在跑龙套中创建身份验证。py文件,将认证相关的代码放入其中

  
 <代码>从rest_framework导入异常
  从rest_framework。身份验证导入BaseAuthentication
  从app01导入模型
  
  #实现自定义的认证类
  类Authtication (BaseAuthentication):
  def(自我,请求进行身份验证):
  #这儿的请求对象不是django原生的请求而是rest_framework内部进行封装过的请求
  #使用的要求。django _request调用原生的请求对象
  令牌=request._request.GET.get(令牌)
  #检查用户的令牌是否合法
  token_obj=models.UserToken.objects.filter(令牌=令牌)当代()
  如果不是token_obj:
  # rest_framework会在内部捕捉这个异常并返回给用户认证失败的信息
  提高exceptions.AuthenticationFailed(“用户认证失败”)
  #在rest_framework内部会将这两个字段赋值给请求以供后续调用
  (token_obj返回。用户、token_obj)  
  



views.py

  
 <代码> django。http进口JsonResponse
  从rest_framework。视图导入APIView
  从app01.utils。身份验证导入Authtication
  进口hashlib
  导入的时间
  
  #生成牌字符串
  def md5(用户):
  ctime=str (time.time ())
  m=hashlib。md5(字节(用户、编码=皍tf - 8”))
  m。更新(字节(ctime、编码=皍tf - 8”))
  返回m.hexdigest ()
  
  #用户登录
  类AuthView (APIView):
  def post(自我,请求):
  ret={“代码”:1000年,“味精”:没有}
  试一试:
  用户=request._request.POST.get(用户名)
  pwd=request._request.POST.get(密码)
  
  obj=models.UserInfo.objects。过滤器(用户名=用户,密码=pwd)当代()
  如果不是obj:
  ret(“代码”)=1001
  ret[‘味精’]="用户名或密码错误”
  #为登录用户创建牌
  令牌=md5(用户)
  #存在更新不存在创建
  models.UserToken.objects。update_or_create(用户=obj,违约率={“令牌”:令牌})
  ret[“令牌”]=令牌
  除了:
  ret(“代码”)=1002
  ret[‘味精’]='请求异常”
  返回JsonResponse (ret)
  
  #业务代码
  课堂秩序(APIView):
  #注册自定义的认证类,可以有多个,从左到右进行认证匹配
  authentication_classes=(Authtication,)
  
  def(自我,请求):
  #请求。用户这个值等于Authtication返回的元组的第一个值
  #请求。身份验证这个值等于Authtication返回的元组的第二个值
  ret={“代码”:1000年,“味精”:没有,“数据”:没有}
  ret(“数据”)='欢迎使用本系统的
  代码返回JsonResponse (ret)  
  



rest_framework内置的认证类:

  
 <代码> BasicAuthentication #基于浏览器实现的基本认证,ftp使用网页登录时使用的就基本是认证
  SessionAuthentication #基于django的用户。is_active进行认证
  TokenAuthentication #简单的基于令牌的认证
  RemoteUserAuthentication #简单的远程用户认证实现 
  


  

配置全局生效的认证类和匿名用户:

  
 <代码>自定义的认证类如果每次都在指定的类中使用authentication_classes指定那么就有可能出现大量的重复代码
  我们可以通过全局设置让指定的认证类对继承至APIView的所有类生效
  
  settings.py
  REST_FRAMEWORK={
  #设置全局生效的认证类(可以有多个)
  # app01为django应用程序的名称
  #跑龙套为应用目录下面的跑龙套目录(这个目录必须包含__init__。py文件)
  #身份验证为跑龙套目录下面的身份验证。py文件
  # Authtication为身份验证。py文件里面的Authtication类
  #这儿的设置其实就是使用从…进口…的路径
  
  “DEFAULT_AUTHENTICATION_CLASSES”:“app01.utils.auth.Authtication”,,
  
  #匿名用户配置
  “UNAUTHENTICATED_USER”:没有,#设置匿名用户的用户名,默认为AnonymousUser,使用的要求。用户查看
  “UNAUTHENTICATED_TOKEN”:没有,#设置匿名用户的令牌,默认为,使用的要求。身份验证查看
  }

django框架休息用户认证