广告
返回顶部
首页 > 资讯 > 后端开发 > Python >rest_framework -- 认证
  • 581
分享到

rest_framework -- 认证

rest_framework 2023-01-30 23:01:46 581人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

#####认证组件##### 一、认证是什么就不说了,某些网页必须是用户登陆之后,才能访问的,所以这时候就需要用上认证组件。 你不用rest_framework的认证组件也行,这种认证的话,完全可以自己写出来。 二、之前再

#####认证组件#####

一、认证是什么就不说了,某些网页必须是用户登陆之后,才能访问的,所以这时候就需要用上认证组件。
    你不用rest_framework的认证组件也行,这种认证的话,完全可以自己写出来。


二、之前再写apiView的时候,那里提到过。
    不记得在哪里的话,先找dispatch方法(APIView的记得),然后是self.initial(request, *args, **kwargs),
    最后找到self.perfORM_authentication(request)。看看这个方法的源码:

        def perform_authentication(self, request):
            """
            Perform authentication on the incoming request.

            Note that if you override this and simply 'pass', then authentication
            will instead be performed lazily, the first time either
            `request.user` or `request.auth` is accessed.
            """
            request.user
        ## 回忆之前,此时的request是rest_framework进行封装后的request了,所以找到的话,就去rest_framework中Request去找。
        ## 下面附上request.user这个方法的源码:

        @property
        def user(self):
            """
            Returns the user associated with the current request, as authenticated
            by the authentication classes provided to the request.
            """
            if not hasattr(self, '_user'):
                with wrap_attributeerrors():
                    self._authenticate()
            return self._user
        ## 它通过property将一个方法装饰成一个属性,此时self是request对象(rest_framework的),经过if判断,执行了self._authenticate()
        ## 那我们继续去看这个方法是什么,附上源码:

        def _authenticate(self):
            """
            Attempt to authenticate the request using each authentication instance
            in turn.
            """
            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也还是request对象(rest_framework的),self.authenticators这个是什么?
        # authenticators它是request的一个属性,那么我们在哪里生成了这个request对象呢?我们回到APIView的dispatch方法,找到这行代码
        # request = self.initialize_request(request, *args, **kwargs),有没有印象,得到一个rest_framework的request对象,
        # 下面是self.initialize_request(request, *args, **kwargs)的源码:

        def initialize_request(self, request, *args, **kwargs):
            """
            Returns the initial request object.
            """
            parser_context = self.get_parser_context(request)

            return Request(
                request,
                parsers=self.get_parsers(),
                authenticators=self.get_authenticators(),
                neGotiator=self.get_content_negotiator(),
                parser_context=parser_context
            )
        authenticators=self.get_authenticators()   ---->> authenticators是一个装着对象的列表
        那么继续看self.get_authenticators()这个方法到底做了些什么,附上源码:

        def get_authenticators(self):
            """
            Instantiates and returns the list of authenticators that this view can use.
            """
            return [auth() for auth in self.authentication_classes]
        返回的是一个列表,那么self.authentication_classes应该就是列表(元组),此时self是视图类的对象

    ####重点:面向对象属性的查找顺序,记住!!
        方式一:我们可以在当前视图类中写一个authentication_classes的列表(元组),里面装着一个一个的类,
               而这个类不是随便的一个类,是进行认证验证的类。
        方式二:当前视图类中没有authentication_classes这个属性,那么便会去APIView中去找该属性,肯定能APIView中能够找到该属性
               authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES -->> api_settings它是一个对象
               我们去看产生api_settings对象的类,其他的不说了,说说这段代码:

                    @property
                    def user_settings(self):
                        if not hasattr(self, '_user_settings'):
                            self._user_settings = getattr(settings, 'REST_FRAMEWORK', {})
                        return self._user_settings
                    这里的setting是通过from Django.core import settings 导入的
               大概意思是:如果django的settings文件中有'REST_FRAMEWORK',那么便会去那里找DEFAULT_AUTHENTICATION_CLASSES这个属性,
                          没有的话,便会去rest_framework的settings文件中找DEFAULT_AUTHENTICATION_CLASSES,
               所以方式二可以这样写,在django的settings文件中写上这样的代码
               REST_FRAMEWORK = {
                   'DEFAULT_AUTHENTICATION_CLASSES':[进行认证的类1,进行认证的类2],

                    }
        方式三:什么都不写,用rest_framework的settings文件中的DEFAULT_AUTHENTICATION_CLASSES

        好了,我们再回到self._authenticate()的源码来看,for循环一个装着对象的列表,所以authenticator就是一个对象,
        user_auth_tuple = authenticator.authenticate(self) --->>> 执行该对象的方法,将返回值赋给user_auth_tuple,
        我们使用前面的方式一,方式二,自己写认证类的的话,那么必须要有authenticate这个方法对吧,这个先放着,
        我们先看方式三,我猜rest_framework的settings文件中的DEFAULT_AUTHENTICATION_CLASSES里的认证类中,也肯定有authenticate方法,
        看看它是怎么写,我们跟着写不就好了嘛?
        地址:from rest_framework import authentication
        看了下每个类中都有authenticate,传来两个参数,一个self,一个request,那我们自己写的认证类也这样写。该方法的返回值将会赋值给user_auth_tuple,
        继续回到def _authenticate(self)这个方法中,继续看,如果返回值user_auth_tuple为None的话,将会继续for循环,返回值为True的话,
        那么这个返回值必须为一个元组,而且只能有两个元素。执行for循环的过程中,authenticate这个方法没有异常的话,那么表示验证成功。


    总结:上面把认证的整个流程都写了一般,那么需要些的东西我列出来,
          1、根据需求要求自己写一个认证类,该类必须要有authenticate这个方法,继承BaseAuthentication这个类
          2、验证通过的话,返回None或者两个元素的元组(列表也行)
          3、验证不通过的话,抛异常,抛这个异常exceptions.APIException
          4、假如只想当前视图类中使用认证功能的话,那么在当前视图类中添加authentication_classes属性
          5、想全局都想进行认证功能,就在django的settings文件中添加
             REST_FRAMEWORK = {
                       'DEFAULT_AUTHENTICATION_CLASSES':[进行认证的类1,进行认证的类2],
                        }
          6、如果你既想全局配置,但是某个局部又不配置认证的话,那么就是该视图类中写authentication_classes,值为[],就好了。

下面写个登陆验证的例子把:test页面必须登陆之后才能访问

models文件:
class User(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    passWord = models.CharField(max_length=32)


class Token(models.Model):
    nid = models.AutoField(primary_key=True)
    token = models.UUIDField(max_length=64)
    user = models.OneToOneField(to='User')


urls文件:
    url(r'login/',views.Login.as_view()),
    url(r'test/',views.Test.as_view()),


views文件:
class Login(APIView):
    def post(self, request, *args, **kwargs):
        response = {'status': 100, 'msg': '登陆成功'}
        name = request.data.get('name')
        password = request.data.get('password')
        try:
            user = models.User.objects.get(name=name, password=password)
            token = uuid.uuid4()
            ret = models.Token.objects.filter(user=user)
            if ret:
                models.Token.objects.filter(user=user).update(token=token)
            else:
                models.Token.objects.create(token=token, user=user)
            response['token'] = token
        except Exception:
            response['status'] = 101
            response['msg'] = '用户名或密码错误'
        return JSONResponse(response)

class Test(APIView):
    authentication_classes = [LoginAuth,]
    def get(self, request, *args, **kwargs):
        return HttpResponse('test get')


auth_class.py文件:

class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token', None)
        try:
            ret = models.Token.objects.get(token=token)
        except ObjectDoesNotExist:
            raise exceptions.APIException('请先进行登陆')
        return ret.user, ret


这里推荐一个发送各种请求的软件,postman

 

--结束END--

本文标题: rest_framework -- 认证

本文链接: https://www.lsjlt.com/news/180512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • rest_framework -- 认证
    #####认证组件##### 一、认证是什么就不说了,某些网页必须是用户登陆之后,才能访问的,所以这时候就需要用上认证组件。 你不用rest_framework的认证组件也行,这种认证的话,完全可以自己写出来。 二、之前再...
    99+
    2023-01-30
    rest_framework
  • Rest_framework Route
    目录 Rest_framework Router 路由器 ViewSet结合Router,自动生成url。 将ViewSet注册到Router中,需...
    99+
    2023-01-30
    Rest_framework Route
  • rest_framework -- mi
    上面的mixins、generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一、mixins模块 mixins : from rest_framewor...
    99+
    2023-01-30
    rest_framework mi
  • laravel Sanctum 认证 — API令牌认证
    laravel Sanctum介绍 Laravel Sanctum 为 SPA (单页面应用程序)、移动应用程序和简单的、基于令牌的 API 提供轻量级身份验证系统。Sanctum 允许应用程序的每个用户为他们的帐户生成多个 API 令牌...
    99+
    2022-10-22
  • 802.1x认证和MAC认证讲解
    目录 802.1x基础 EAP(Extensible Authentication Protocol)可扩展认证协议 EAPoL(EAP over LAN)局域网可扩展认证协议 802.1x体系架构 受控端口的受控方式 802.1x认证 8...
    99+
    2023-09-02
    网络 服务器
  • Oracle中两种认证方式:OS认证与口令文件认证
    相关链接:SYS,SYSTEM,DBA,SYSDBA,SYSOPER的区别与联系    首先谈谈Oracle安装与OS用户组.Oracle在安装和维护过程...
    99+
    2022-10-18
  • H3CNE认证
    H3CNE(H3C Certified Network Engineer,H3C认证网络工程师)H3CNE认证主要定位于中小型网络的规划、设计、配置与维护。通过H3CNE认证,将证明您对数据通信网络有全面深入的了解,掌握面向中小型企业的网络...
    99+
    2023-01-31
    H3CNE
  • Portal认证
    Portal认证通常又称Web认证,用户上网时,必须在Portal认证页面进行认证,如果未认证成功,仅可以访问特定的网络资源,认证成功后,才可以访问其他网络资源。 Portal认证具有以下优点: 简单方便,客户端不需要安装额外的软件,直接...
    99+
    2023-10-21
    网络 服务器 运维
  • 认证组件
    一、认证组件   只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查询,没有登录就不能查看 ,这时候就要用到认证组件 二、局部使用 (1)models层 class UserInfo(models.M...
    99+
    2023-01-30
    组件
  • python http认证
    #!/usr/bin/env pythonimport urllib2import re# this creates a password managerurl='http://test/nagios/cgi-bin/status.cgih...
    99+
    2023-01-31
    python http
  • 华为认证网络工程师怎么认证?
    分为以下几点 1、确定认证方向 三个等级:HCIA(低)、HCIP(中)、HCIE(高) 方向:华为认证分为了很多个方向,其中比较常见的有大数据、企业通信、云计算、云数据中心、存储、路由与交换、安全、传送、人工智能、网络统一通信、云服...
    99+
    2023-08-31
    windows linux 服务器 网络安全 华为 Powered by 金山文档
  • 认证方式总结(802.1x,PPPOE,IPOE,Portal,MAC认证)
    1.802.1x: 认证设备NAC:交换机 802.1x协议是基于Client/Server的访问控制和认证协议。它可以限制未经授权的用户/设备通过接入端口(access port)访问LAN/WLAN。在获得交换机或LAN提供的各种业务之...
    99+
    2023-09-06
    macos 网络 服务器
  • 基于.Net Core认证授权方案之JwtBearer认证
    目录一.前言二.Bearer认证三.JWT四.开始1. 注册认证服务2.接口资源保护3. 生成Token五. 运行六.扩展说明1、Basic基础认证2、Digest摘要认证七.注意八...
    99+
    2022-11-13
  • ssl证书认证怎么做
    SSL证书是一种数字证书,用于验证网站身份和数据加密。以下是SSL证书认证的步骤:1. 选择SSL证书:选择适合您网站的SSL证书类...
    99+
    2023-06-12
    ssl证书认证 ssl证书
  • 【Django】REST_Framework框架——APIView类源码解析
    一、APIView类源码解析 1、APIView是REST framework提供的所有视图的基类,继承自Django的View父类。 2、APIView与 View的不同之处在于: 1、传入到...
    99+
    2023-09-14
    django python 后端
  • python http 认证 auth
    # -*- coding: utf-8 -*- import requests BASE_URL = 'https://api.github.com' def construct_url(end_point): ret...
    99+
    2023-01-31
    python http auth
  • ORACLE认证介绍
    ORACLE考试简介OCP (Oracle Certified Professional)是由Oracle公司颁布并实施的一项权威的专业技术标准,它是专为认证那些能够满足对OR...
    99+
    2022-10-18
  • varnish 3 telnet 认证
    varnish 3 telent 连接认证 telnet 连接varnish服务器,管理varnish,纠结了很久。一直报错~~ 官网方式 https://www.varnish-cache.org/docs/3.0/reference/v...
    99+
    2023-01-31
    varnish telnet
  • OAuth2认证流程
    目录 什么是OAuth2 1. OAuth2认证流程 1、用户点击微信扫码 2、用户授权黑马网站访问用户信息 3、黑马程序员的网站获取到授权码 4、携带授权码请求微信认证服务器申请令牌 5、微信认证服务器向黑马程序员的网站响应令牌 6、黑马...
    99+
    2023-08-31
    微信 java
  • ospfv3 认证配置
        ospfv3是基于ipv6的路由协议,因为IPV6本身的IPSEC安全特性,OSPFV3本身就已经没有再带安全认证功能,这一功能由IPV6协议来完成。     (我查了好久,书里并没有提到如何配置,国内的论坛也很少说到,即使有说到配...
    99+
    2023-01-31
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作