django restframework学习笔记:认证组件

作用

用来用户授权,100个API,1个无需登录即可使用,99个登录才能使用

直接用

编写类 -> 认证组件

继承BasicAuthentication,并且定义authenticate函数

应用认证组件

在视图类里加入 authentication_classes = [MyAuthentication, ]

逗号后面可以加多个认证方法

不需要认证的视图就加authentication_classes = [ ]

全局配置

因为有多个需要验证的视图类,就可以加进全局配置里,就不用每个都写了

注:在drf中,优先先去全局中读取,再去视图类中读取。

(也就是视图类中又定义了就以视图类里定义的为准,会覆盖全局配置)

但是验证组件放进视图里会跟全局起冲突,所以要单独拿出来,然后视图中调用即可

(这里单独定义 ext/auth.py 了)

多个认证类

当前端有不同校验方法从而产生多个认证类的时候

假如所有的认证类都返回了None,但是根据drf的源代码可以知道

视图函数仍然会被执行,只不过 self.user self.auth = None

所以如果是多个认证类,要求有其中一个认证通过才能看视图,都不通过的话不能看视图

那么前面的验证类应该返回

return (验证失败了,也可以不写,默认返回空)

或者

return ‘token’ (验证成功了)

然后到最后一个验证类表示验证失败抛出异常

1
raise AuthenticationFailed({'code':20000, 'error':"认证失败"})

状态码

如果认证类不含authenticate_header方法,会导致状态码异常

为了返回的正确性,验证类要添加

1
2
def authenticate_header(self, request):
return "API"

子类约束

python里如果有这种方法,约束了子类中必须要定义这个方法(类似于java的接口、抽象类和抽象方法)

1
2
3
4
5
6
7
class Foo(object):
def f1(self):
raise NotImplementedError("...")

class News(Foo):
def f1(self):
print('1234')