已知:authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
我们知道,rest framework 中认证authentication_classes类是在配置文件中,那么我们也可以把自己写的类注册到这个配置文件。这样就不用在每个视图中写。他默认就会调用。
那么走源码流程,进入api_settings看看内部结构。
api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS) def reload_api_settings(*args, **kwargs): setting = kwargs['setting'] if setting == 'REST_FRAMEWORK': api_settings.reload() #加载REST_FRAMEWORK具体怎么加载的还不知道,暂时看到官方是配置这个文件。照做 setting_changed.connect(reload_api_settings)
settings.py设置全局认证:
#最外层的key REST_FRAMEWORK ={ "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authtication',] #把视图中的Authtication类剪切到目录utils.auth下 }
现在就可以把我们在视图中写的Authtication类拿过去,然后视图中就不用写了
但是会发现一个问题,登录类也需要token否则抛出异常,那么这个例如登录这种不需要认证的就需要在视图中,写一个空authentication_classes,没有认证类就好了。
总结:也就是全局认证可以去配置文件写,局部不使用可以在视图中重写authentication_classes为空,那么同理,局部使用其他认证,也可以在视图内重写authentication_classes。
扩展:
内置认证都继承自BaseAuthentication,所以以后自定义认证也同意继承BaseAuthentication,修改后的自定义认证类:
from API import models from rest_framework import exceptions from rest_framework.authentication import BaseAuthentication class Authtication(BaseAuthentication): def authenticate(self,request): #user_auth_tuple = authenticator.authenticate(self)跟踪得到,默认调用authenticate方法,返回一个元组 token = request._request.GET.get('token') token_obj = models.UserToken.object.filter(token=token).first() if not token_obj: raise exceptions.APIException('用户认证失败') return (token_obj.user,token_obj.token) def authenticate_header(self,request): '这个方法暂时不知道干啥,不加保存,加上不用先' pass