源码解析 – 认证
0x01 drf认证流程
之前在版本的时候了解到了django中CBV的执行流程,最后走到了dispatch()方法。寻找版本的时候,先看了一下通过Request类对当前的request对象进行封装,然后执行initial()方法,里面有版本值的获取方式,今天的认证也是基于dispatch,一步一步的向下走。
APIView dispatch
1 | class APIView(View): |
initialize_request
1 | def initialize_request(self, request, *args, **kwargs): |
get_authenticators
1 | def get_authenticators(self): |
initial
1 | class APIView(View): |
perform_authentication
1 | class APIView(View): |
Request().user
1 | class Request: |
wrap_attributeerrors
1 |
|
_authenticate
1 | class Request: |
当用户发来请求时,找到认证的所有类并实例化成为对象列表,然后将对象列表封装到新的request对象中。
以后在视同中调用request.user
在内部会循环认证的对象列表,并执行每个对象的authenticate方法,该方法用于认证,他会返回两个值分别会赋值给
request.user/request.auth
差不多就是这些,再细的话,就是每行加注释了,如果都是注释的话,我是看不下去的。不过知道了总体流程的话,一些小细节我相信还是可以看懂的
0x02 认证示例
settings.py
1 | REST_FRAMEWORK = { |
api.extends.auth
1 | from rest_framework.authentication import BaseAuthentication |
urls.py
1 | from django.conf.urls import url,include |
models.py
1 | from django.db import models |
views.py
1 | from api import models |
1 | 分别请求两个链接,认证之后的才有数据 |