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日

相关文章

  • JWT的介绍和使用

    JWT的含义 Json web token(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(sso)场景,JWT的声明一般被用来在身份提供者和服务者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声…

    2023年4月2日
    00
  • django中APIView里的dispatch和as_view方法分析

    位置: from rest_framework.views import APIView 继承APIView类视图形式的路由: path(‘booksapiview/’, views.BooksAPIView.as_view()), #在这个地方应该写个函数内存地址 继承APIView类的视图函数: from rest_framework.views imp…

    Python开发 2023年4月2日
    00
  • 文章的点赞点踩制作

    文章的添加 博客园打开需要拷贝的文章,右键检查–》选择cnblogs_post_body这一个div,然后复制outer HTML到admin后台文章表里面 最后需要在文章详情页的文章内容那一行添加一个|safe 点赞点踩制作 前端样式: 不会写,直接拷贝博客园的点赞点踩html和css样式 {# 点赞点踩样式开始:复制博客园的点赞点踩样式,拷贝其对应的o…

    2023年4月2日
    00
  • 文章详情页制作

    url的设计 /usrname/article/1 /用户名/article/文章主键值 re_path(r’^(?P<username>\w+)/article/(?P<article_id>\d+)/$’,views.article_detail,name=’detail’), 视图函数的设计 # 七、文章详情页 def arti…

    Python开发 2023年4月2日
    00
  • 个人站点页面搭建和侧边栏展示功能

    展示个人站点页面 前端代码:和首页文章展示基本一样: <div class=”col-md-8″> {% for article in article_list %} <ul class=”media-list”> <li class=”media”> <a href=””><h4 class=”medi…

    Python开发 2023年4月2日
    00
  • django的基本介绍与操作

    django的基本操作 1.django的安装 (1)在ubuntu上的安装 sudo pip3 install django==2.1.12(版本号) 检查安装是否成功: sudo pip3 freeze|grep -i ‘Django’ 有输出django==2.2.12 表示安装成功 (2)在windows上的安装 在终端执行 pip3 install…

    2023年4月2日
    00
  • 基本数据类型之列表

    1.列表的定义 1.采用变量名=[]的方式定义2.采用变量名=list()的方式定义 2.列表的作用 列表是用来存多个数据,并且这些数据是需要按位置存放的,后面我们可以通过索引取出列表里的数据。 3.类型转换 但凡可以被for循环遍历的类型(可迭代对象)都可以当做参数传给list()转成列表 4.列表的内置方法 # 1.按照索引取改值(正向取改+反向取改) …

    Python开发 2023年4月2日
    00
  • django中CBV视图模式的View源码分析

    位置: 1.找到自己项目用的解释器存储位置H:\pythonProject\Lib\site-packages\django\views\generic\base.py在base.py里有一个View类 2.也可以通过from django.views import View 按住ctrl点击View会直接跳到该类的位置 CBV形式的路由 path(r’^l…

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