django rest framework用户认证


  • 进入rest framework的Apiview

    •  @classmethod
      def as_view(cls, **initkwargs):
      """
      Store the original class on the view function. This allows us to discover information about the view when we do URL
      reverse lookups. Used for breadcrumb generation.
      """
      if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
      def force_evaluation():
      raise RuntimeError(
      'Do not evaluate the `.queryset` attribute directly, '
      'as the result will be cached and reused between requests. '
      'Use `.all()` or call `.get_queryset()` instead.'
      )
      cls.queryset._fetch_all = force_evaluation view = super().as_view(**initkwargs)
      view.cls = cls
      view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated,
      # all other authentication is CSRF exempt.
      return csrf_exempt(view)

      django的类视图是调用内部的as_view方法来实现CBV,在第18行调用了父类的as_view,父类的as_view调用了dispatch方法,这里在ApiView自定义了dispatch


    •      def dispatch(self, request, *args, **kwargs):
      """
      `.dispatch()` is pretty much the same as Django's regular dispatch,
      but with extra hooks for startup, finalize, and exception handling.
      """
      self.args = args
      self.kwargs = kwargs
      request = self.initialize_request(request, *args, **kwargs)
      self.request = request
      self.headers = self.default_response_headers # deprecate? try:
      self.initial(request, *args, **kwargs) # Get the appropriate handler method
      if request.method.lower() in self.http_method_names:
      handler = getattr(self, request.method.lower(),
      self.http_method_not_allowed)
      else:
      handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) except Exception as exc:
      response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs)
      return self.response

      和django的dispatch类似,第8,9行对request进行了封装

    •      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
      )

      封装函数内部返回的是Request对象

    •  class Request:
      """
      Wrapper allowing to enhance a standard `HttpRequest` instance. Kwargs:
      - request(HttpRequest). The original request instance.
      - parsers_classes(list/tuple). The parsers to use for parsing the
      request content.
      - authentication_classes(list/tuple). The authentications used to try
      authenticating the request's user.
      """ def __init__(self, request, parsers=None, authenticators=None,
      negotiator=None, parser_context=None):
      assert isinstance(request, HttpRequest), (
      'The `request` argument must be an instance of '
      '`django.http.HttpRequest`, not `{}.{}`.'
      .format(request.__class__.__module__, request.__class__.__name__)
      ) self._request = request
      self.parsers = parsers or ()
      self.authenticators = authenticators or ()
      self.negotiator = negotiator or self._default_negotiator()
      self.parser_context = parser_context
      self._data = Empty
      self._files = Empty
      self._full_data = Empty
      self._content_type = Empty
      self._stream = Empty if self.parser_context is None:
      self.parser_context = {}
      self.parser_context['request'] = self
      self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET force_user = getattr(request, '_force_auth_user', None)
      force_token = getattr(request, '_force_auth_token', None)
      if force_user is not None or force_token is not None:
      forced_auth = ForcedAuthentication(force_user, force_token)
      self.authenticators = (forced_auth,)

      Request对象的初始化函数,它将原生django的request对象赋值给self._request,所以在ApiView视图中想使用原生的request要用request._request来使用

    • 查看self.authenticators
    • self.authenticators等于传进来的authenticators
    • 在ApiView内部定义了get_authenticators方法,它会被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里面找定义好的对象再将其实例化

    • 定义自定义验证类
      from rest_framework.views import APIView
      from django.http import HttpResponse
      from rest_framework.authentication import BaseAuthentication
      from rest_framework.exceptions import AuthenticationFailed class MyAuthentication(BaseAuthentication):
      def authenticate(self, request):
      if not request._request.GET.get('name'):
      raise AuthenticationFailed
      return ('user', None) def authenticate_header(self, request):
      pass class MyView(APIView):
      authentication_classes = [MyAuthentication] def get(self, request):
         user = request.user
      return HttpResponse(user)

      验证类继承BaseAuthentication(不继承也可以,但都要实现authenticate)方法,在authenticate里面实现用户的认证,最后返回一个元祖,第一个元素为user对象,该对象被request.user接受, 第二个元素会被request.auth捕捉

    • 效果

django rest framework用户认证的更多相关文章

  1. Django Rest framework 之 认证

    django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...

  2. Django 中的用户认证

    Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...

  3. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  4. Django Rest Framework用户访问频率限制

    一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...

  5. Django组件之用户认证组件

    一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenticate( ...

  6. Django Rest Framework之认证

    代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpa ...

  7. 使用django实现自定义用户认证

    参考资料:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/    直接拉到最后看栗子啦 django自定义用户认证(使用自 ...

  8. 09 Django组件之用户认证组件

    没有学习Django认证组件之前使用装饰器方法 from django.shortcuts import render, HttpResponse, redirect from app01.MyFor ...

  9. Django组件之用户认证

    auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenticate( ...

随机推荐

  1. python3使用js2py

    安装: pip install js2py 使用: 执行js函数: 执行js函数: import js2py js = js2py.EvalJs({}) js.execute("" ...

  2. Graylog2进阶 打造基于Nginx日志的Web入侵检测分析系统

    对于大多数互联网公司,基于日志分析的WEB入侵检测分析是不可或缺的. 那么今天我就给大家讲一讲如何用graylog的extractor来实现这一功能. 首先要找一些能够识别的带有攻击行为的关键字作为匹 ...

  3. 【Weiss】【第03章】练习3.18:检查平衡符号

    [练习3.18]用下列语言编写检测平衡符号的程序 a.Pascal ( begin/end, ( ), [ ], { } ). b.C语言( /* */, ( ), [ ], { }). c.解释如何 ...

  4. strongsan基本用法

    0x01 安装 ====> CentOS RPM安装 下载:https://pkgs.org/download/strongswanwget http://download-ib01.fedor ...

  5. Ruby中的Hash(哈希),你可以理解为字典

    原文链接 以下代码在Ruby 2.5.1中编译通过 定义 myHash = Hash.new myHash1 = Hash["key1" => 100, "key2 ...

  6. MySQL数据备份与恢复(二) -- xtrabackup工具

    上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为普遍的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容. 1.  xtrabackup 工具的安装 1.1  安装依赖包 ...

  7. 使用SpringBoot + JavaMailSender 发送邮件报错 Mail server connection failed;Could not connect to SMTP host

    说明: 出于安全考虑,阿里云默认封禁 TCP 25 端口出方向的访问流量,无法在阿里云上的云服务器通过 TCP 25 端口连接外部地址. [官方提示]:如果您需要使用阿里云上的云服务器对外部发送邮件, ...

  8. Java并发编程之支持并发的list集合你知道吗

    Java并发编程之-list集合的并发. 我们都知道Java集合类中的arrayList是线程不安全的.那么怎么证明是线程不安全的呢?怎么解决在并发环境下使用安全的list集合类呢? 本篇是<凯 ...

  9. Java集合工具类使用的一些坑,Arrays.asList()、Collection.toArray()、foreach

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  10. 面试刷题25:jvm的垃圾收集算法?

    垃圾收集是java语言的亮点,大大提高了开发人员的效率. 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别. 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪 ...