django-rest-framework的认证流程源码简单解析

lihao-like 2018-08-14 原文

django-rest-framework的认证流程源码简单解析

  在编写购物车功能时需要实现未登录状态下的添加购物车功能,但是django的认证在进入视图函数前就会进行,如果未登陆的话请求根本进不到接口(在使用

JWT验证的时候),由于前段会携带JWT字段但却没有携带值,导致认证功能报错。

  那么如何解决呢?

  perform_authentication()这个函数是在程序进入视图函数前运行的

def initial(self, request, *args, **kwargs):
        self.format_kwarg = self.get_format_suffix(**kwargs)
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme
        self.perform_authentication(request)  #
        self.check_permissions(request) 
        self.check_throttles(request) 

  这个函数 return request.user

  这里的request.user是个property装饰的方法

@property
    def user(self):
        if not hasattr(self, '_user'):
            self._authenticate()
        return self._user

  

def _authenticate(self):
        for authenticator in self.authenticators:
            try:
                user_auth_tuple = authenticator.authenticate(self) #重点
            except exceptions.APIException:
                self._not_authenticated()
                raise

            if user_auth_tuple is not None:
                self._authenticator = authenticator   #验证用户的功能
                self.user, self.auth = user_auth_tuple
                return

        self._not_authenticated()

  其中的self.authenticators是我们在视图类中定义的authentication_classes,即身份认证类。

  最终,认证类中的authenticate方法会返回一个用户对象给request.user,我们的用户就是这么获得的。

  而在后面的 self.check_permissions(request) 方法,是进行权限验证的,最终在我们定义的权限类中的 has_permission 方法返回

 return request.user and request.user.is_authenticated

  言归正传,如果想实现在不登录下的进入视图,那么我们只需要重写perform_authentication()方法,即

 def perform_authentication(self, request):
        """
        重写父类的用户验证方法,不在进入视图前就检查JWT
        """
        pass

  之后再在视图函数中判断用户是否登录

try:
    user = request.user
except Exception as e:
    user = None
if user and user.is_authenticated:
    """如果用户登录的操作"""
else:
    """如果用户没登录的操作"""

 

以上

 

 

 

 

 

 

 
发表于 2018-08-14 17:26 roseli 阅读() 评论() 编辑 收藏

 

版权声明:本文为lihao-like原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lihao-like/p/9475986.html

django-rest-framework的认证流程源码简单解析的更多相关文章

  1. 爬取博主所有文章并保存到本地(.txt版)–python3.6

    闲话: 一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份。 正好最近在 […]...

  2. Python 浅谈编程规范和软件开发目录规范的重要性

           最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每 […]...

  3. Flask入门很轻松(三)—— 模板

    Jinja2模板引擎 Flask内置的模板语言,它的设计思想来源于 Django 的模板引擎,并扩展了其语法和 […]...

  4. redis-dump 报错:ERROR (Errno::ENOENT): No such file or directory – ps -o rss= -p 6128

    ERROR (Errno::ENOENT): No such file or directory – […]...

  5. flask 异步celery使用

    在开发过程中,耗时长,超时的任务经常发生,比如:获取后端某个大文件数据超时、需要后端计算任务超时,等等, 此时 […]...

  6. 超平面多维近似向量查找工具annoy使用总结

    需求:我有800万的中文词向量,我想要查询其中任意一个向量对应的最邻近的向量是哪些。通常情况下如果向量集比较小 […]...

  7. Python 从入门到进阶之路(五)

    之前的文章我们简单介绍了一下 Python 的函数,本篇文章我们来看一下 Python 中的面向对象。  Py […]...

  8. python3+tkinter实现的黑白棋,代码完整 100%能运行

    今天分享给大家的是采用Python3+tkinter制作而成的小项目——黑白棋 tkinter是Python内 […]...

随机推荐

  1. notepad++快捷键 – Jimlilili

    notepad++快捷键 rl+Shift+U 选中的文件转化为大写 Ctrl+U 选中的文件转化为小写...

  2. Js 时间戳显示和计算时间间隔

    显示时间戳 很多地方会让页面显示当前时间并实时计时功能,例:2019年5月23号 10:28::34 代码实现 […]...

  3. ubuntu的命令行状态和图形化界面切换 (转) – 雨钝风轻

    ubuntu的命令行状态和图形化界面切换 (转) 1.ubuntu命令状态切换到图形化界面 startx 如果 […]...

  4. 掩码计算UDAF

    写的一个内部使用的UDAF,参照hive的sum和这位大哥的udafhttp://www.fuzhijie.m […]...

  5. 数据仓库项目管理面试题整理(四) – 李梦蛟

    数据仓库项目管理面试题整理(四) 组织与职员配备问题整理 1.数据仓库经理认为自己的团队应该对CIO负责,但是 […]...

  6. 【部分转载】安装MySQL,visual studio tools for office 2010 runtime通不过 – nashviller

    【部分转载】安装MySQL,visual studio tools for office 2010 runti […]...

  7. django项目工程搭建

    一.环境安装  1.1创建虚拟环境  mkvirtualenv django_py3 -p python3   […]...

  8. 常见的数据分析模型 – xuzhengzhu

    https://www.zhihu.com/question/36360374   作者:GrowingIO链 […]...

展开目录

目录导航