<代码> 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框架休息用户认证