rest_framework认证源码分析

认证源码分析

位置 :

APIVIew----》dispatch方法---》self.initial(request, *args, **kwargs)---->有认证,权限,频率三个版块

分析:

只读认证源码: self.perform_authentication(request)---》
self.perform_authentication(request)就一句话:request.user,需要去drf的Request对象中找user属性(方法)---》
Request类中的user方法,刚开始来,没有_user,走 self._authenticate()
image

核心:Request类的 _authenticate(self):

1.在需要进行认证的视图类中添加(认证类是自己写的类,该类继承了BaseAuthentication):

image

2.此时apiview里的 authentication_classes就变成了自己第一步在视图函数类里定义的了,而不会去自己的配置文件里找

image

3.然后正常执行到apiview里的dispatch方法:

image

4.dispatch方法内部又调用了initialize_request方法,返回了一个新的request对象

image

5.authenticators这个的值是get_authenticators()方法的返回值:返回值是一个个自己定义的继承了BaseAuthentication类的认证类对象

image

6.Request类中的authenticators变成了自定义类的对象

image

7.在继续走apiview里的dispatch方法里的initial方法

image

8.进入认证模块的方法

image

9.进入新封装request对象里
image

image

10.核心_authenticate方法

def _authenticate(self):
    # self是Request对象,所以去Request对象里找authenticators,
    # 最后self.authenticators的结果就是一个列表,列表里面是一个个自定义认证类的对象
    for authenticator in self.authenticators:
        try:
            # 此时authenticator就是认证类的对象,对象调用了authenticate方法,这个方法是需要我们在认证类里重新写的
            # 这个方法有两个返回值
            user_auth_tuple = authenticator.authenticate(self)
        except exceptions.APIException:
            self._not_authenticated()
            raise

        if user_auth_tuple is not None:
            self._authenticator = authenticator
            # 这两个返回值给了Request对象,就是request.user和request.auth(这就是为什么要求自己重新写的authenticate方法要有两个返回值了)
            self.user, self.auth = user_auth_tuple
            return

    self._not_authenticated()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:rest_framework认证源码分析 - Python技术站

(0)
上一篇 2023年4月2日 下午4:37
下一篇 2023年4月2日

相关文章

  • django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式;CBV是指视图函数以类的方式。 2.普通FBV形式 def index(request): return HttpResponse(‘index’) 3.CBV形式 3.1 CBV形式的路由 path(r’^login/’,views.MyLogin.as_view()) 3.2 CBV形式的视图…

    Python开发 2023年4月2日
    00
  • 上线流程

    上线流程 上线前准备 首先将跑在本地版本的项目,上传至远端(gitee、github上) 重新复制一份项目的配置文件,可以命名为pro.py(dev为开发阶段的配置文件,pro为上线的配置文件) 在pro文件内,修改以下配置项: # 将调式模式改为false DEBUG = False # 运行的host地址,正常就是写服务端的ip地址,不知道可以先写* A…

    2023年4月2日
    00
  • flask基础介绍和语法

    flask基础介绍和语法 flask项目初始化的app.py介绍 # 从flask包中导入flask类 from flask import Flask # 使用flask类实例化出一个app对象 # __name__:代表当前app.py这个模块 app = Flask(__name__) # 创建一个路由和视图的映射 @app.route(‘/’) def…

    2023年4月2日
    00
  • 支付宝支付

    支付宝支付流程 在python中封装alipay 安装 >: pip install python-alipay-sdk –upgrade # 如果抛ssl相关错误,代表缺失该包 >: pip install pyopenssl 结构 libs ├── AliPay # aliapy二次封装包 │ ├── __init__.py # 包文件 │…

    2023年4月2日
    00
  • 数据库配置限)不用root用户操作数据库了(为数据库创建用户,并赋予权限)

    步骤 1.为路飞项目创建数据库 在mysql终端输入以下代码: create database luffy charset=utf8; 2.创建数据库用户 create user ‘username’@’host’ identified by ‘password’; 其中username为自定义的用户名;host为登录域名,host为’%’时表示为 任意IP…

    Python开发 2023年4月2日
    00
  • 一切皆对象和深浅拷贝

    1.元类 元类的来源是:python中一切皆对象。 1.1 什么是元类 元类就是用来实例化产生类的类 关系:元类—实例化—类(自定义的类)—实例化—-对象(obj) 1.2如何查看内置的元类 1.type是内置的元类2.我们用class关键字定义出来的所有类以及内置的类都是由内置的元类type实例化产生的 例如:在python中int、dic…

    2023年4月2日
    00
  • 小程序子页面向父页面传值、腾讯云对象存储上传图片

    1. 页面传值 1.1 父页面向子页面传值 父页面: /pages/xx/xxx?id=1 子页面 // option就可以接收到父页面传来的值 onLoad:function(option){ } 1.2 子父页面 子页面 var pages = getCurrentPages() var prevPage = pages[pages.length-2] …

    Python开发 2023年4月2日
    00
  • django中的request对象方法

    1.什么是request对象 在django中,当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象;Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。 2.request对象的作用 request对象里面封装了请求时拿到的数据,我们可以通过request.的…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部