我的编程空间,编程开发者的网络收藏夹
学习永远不晚

rest_framework -- 认证

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

rest_framework -- 认证

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

下载Word文档

猜你喜欢

rest_framework -- 认证

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

rest_framework -- mi

上面的mixins、generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承一、mixins模块mixins : from rest_framework im
2023-01-30

Rest_framework Route

目录 Rest_framework Router 路由器 ViewSet结合Router,自动生成url。 将ViewSet注册到Router中,需要三个要素:
2023-01-30
2023-10-21

华为认证、华三认证、思科认证应该如何选择?

  对于从事IT行业的朋友们来说,说到行业内的认证,大家普遍认同的就是华为认证、华三认证以及思科认证。这三个认证证书,不管拿到哪一个,都会被企业所认可,就业方面也会有一定的助力,但是大家在选则时候,总会纠结到底该选哪一个。那么今天编程学习网小编为大家分别介绍一下华为认证、华三认证、思科认证,看了之后,大家应该就能大概知道如
华为认证、华三认证、思科认证应该如何选择?
2024-04-18

H3CNE认证

H3CNE(H3C Certified Network Engineer,H3C认证网络工程师)H3CNE认证主要定位于中小型网络的规划、设计、配置与维护。通过H3CNE认证,将证明您对数据通信网络有全面深入的了解,掌握面向中小型企业的网络
2023-01-31

Juniper认证与华为认证哪个好?

  Juniper认证与华为认证哪个好?华为认证相信大家会比较熟悉,而Juniper认证可能听过的人不多,那么在了解Juniper认证与华为认证哪个好之前,我们先来了解一下Juniper认证。  Juniper认证是什么?  Juniper认证是由Juniper网络公司推出的认证,这个公司致力于实现网络商务模式的转型,
Juniper认证与华为认证哪个好?
2024-04-18

怎么认证ssl证书

怎么认证ssl证书?SSL证书是一种数字证书,用于加密数据传输和验证网站身份。通过认证SSL证书,可以确保用户的数据在网络传输过程中得到保护,同时提供了对网站身份的验证,防止恶意伪造网站。下面将介绍认证SSL证书的基本步骤。
怎么认证ssl证书
2024-01-23

python http认证

#!/usr/bin/env pythonimport urllib2import re# this creates a password managerurl='http://test/nagios/cgi-bin/status.cgi?
2023-01-31

认证组件

一、认证组件  只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查询,没有登录就不能查看 ,这时候就要用到认证组件二、局部使用(1)models层class UserInfo(models.Model):
2023-01-30

软考是专业认证还是职业认证

  软考是专业技术职业资格考试,是由国家人力资源和社会保障部、工业和信息化部领导的国家级考试,其目的是,科学、公正地对全国计算机与软件专业技术人员进行职业资格、专业技术资格认定和专业技术水平测试。  软考属于专业技术职业资格考试,软考全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部(原人事部)
软考是专业认证还是职业认证
2024-04-18

CCIE认证考试

编程学习网:CCIE是全球公认的IT业内最权威的认证,CCIE认证不仅象征着你技术水平,也是一种自我价值的体现……
CCIE认证考试
2024-04-23

ssl证书认证怎么做

SSL证书是一种数字证书,用于验证网站身份和数据加密。以下是SSL证书认证的步骤:1. 选择SSL证书:选择适合您网站的SSL证书类型,如域名验证证书、组织验证证书或增强验证证书。2. 申请证书:向SSL证书颁发机构(CA)提交证书申请,并
2023-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录