广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Django-restframework
  • 473
分享到

Django-restframework

Djangorestframework 2023-01-30 23:01:58 473人浏览 泡泡鱼

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

摘要

前言 最近学习了 Django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部分方法还不太清楚),于是想详细的总结一下当来一个请求时,在该框架里面是如何执行的? 启动项目时

前言

最近学习Django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部分方法还不太清楚),于是想详细的总结一下当来一个请求时,在该框架里面是如何执行的?

启动项目

昨天在调试djanGo时,发现在 apiView 中打的断点没有断下来,而是打在 View 中的断点断下来了,调试了很多次,最后发现,在 django 项目启动时,会首先加载 urls 中的文件,执行 views 中类的 as_view方法,其实是继承自 APIView 的,APIView 继承自 django 原生 View 的as_view 方法。

里面一个参数叫 pattern_name,对应的值是admin:auth_group_change,如下图所示:

目前还不清楚这里面的具体流程是什么,但是并不妨碍阅读之后的源码,在这只要清楚一点,在 Django 项目启动时,路由所对应的CBV里面的相关方法的内存地址已经获取到。这样做的好处就是提高效率,坏处可能有一点点,会提升性能的消耗。

具体路由和逻辑代码

在这里假设来一个 GET 请求,urls 和 views里面的代码如下:

# urls.py

url(r'^book/(?P<id>\d+)/', views.Book.as_view()),
# views.py
class Book(APIView):

    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request, id):

        response = {'status': 100, 'msg': None}

        book = models.Book.objects.filter(pk=id).first()
        book_ser = BookSerib(book, many=False)
        print('book_ser.data', book_ser.data)
        response['books'] = book_ser.data
        response['msg'] = '获取图书成功'
        print('response', response)
        return Response(response)

urls 里面就是一个典型的 CBV 的路由配置,在 views 中一个是路由分发方法,一个是获取单本图书信息(通过 id)。

as_view 具体执行流程

在项目启动时,相应的函数内存地址已经获取到,那么具体是怎么获取到的呢?

在上面的代码中可以看到 Book类是继承自APIView类的,所以在路由配置里面执行的as_view方法如果Book类没有重写,那么执行的就是按照mro列表顺序查找到的第一个方法,在这里执行的是APIView类中的as_view方法。

查看该源码如下:

APIView类的父类是View类,查看该类的as_view方法,源码如下:

具体as_view就是将view函数的内存地址返回,以便请求来时直接调用。

initkwargs这个参数应该是由 django 内部传的一些参数,如下所示:

请求到来时

因为经过 django 先执行了as_view返回view的内存地址,所以会直接执行view函数,如下:

在这里该 self 由于是 继承自APIView类的Book类的对象,所以dispatch方法首先去自身找,之后去父类找,在APIView类中找到dispatch方法,源码如下:

initialize_request方法:

源码如下:

在实例化Request对象时,authenticators参数需要在认证时使用,所以先把这个参数的值找出来。步骤如下:

  • 调用 self.get_authenticators

  • 找到 self.authentication_classes

  • 找到 api_settings,才能找到DEFAULT_AUTHENTICATION_CLASSES

  • DEFAULT和IMPORT_STRINGS参数
  1. DEFAULT参数

  1. IMPORT_STRINGS参数

  • 实例化 APISettings 对象

  • 通过__getattr__方法获取值

  • 执行perfORM_import方法

  • 执行import_from_string

  • 执行import_module

  • 执行_bootstrap._GCd_import

  • 执行_sanity_check

  • _sanity_check返回,执行_find_and_load方法

  • 所以通过__getattr__的到的是一个列表,里面是两个类,分别是[rest_framework_authentication_SessionAuthentication, rest_framework_authentication_BasicAuthentication]

到这里,initialize_request方法执行结束,得到一个经过 Request 类实例化的 request 对象,该对象里面含有原生 request 对象,可以通过request._request取到。

initial 方法:

源码如下:

这里传入的request参数是经过Request封装后的参数

  • 执行get_format_suffix

执行完这个方法,self_format_kwarg = None

  • 执行perform_content_negotiation

  1. 执行self.get_renders

  1. 执行self.get_content_negotiator

  1. 执行 conneg.select_renderer方法

未完待续…...

--结束END--

本文标题: Django-restframework

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

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

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

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

下载Word文档
猜你喜欢
  • Django-restframework
    前言 最近学习了 django 的一个 restframework 框架,对于里面的执行流程产生了兴趣,经过昨天一晚上初步搞清楚了执行流程(部分方法还不太清楚),于是想详细的总结一下当来一个请求时,在该框架里面是如何执行的? 启动项目时...
    99+
    2023-01-30
    Django restframework
  • Django RestFramework
    1.基础函数视图(@api_view) DRF提供了一种函数基础视图来装饰Django的普通视图,我们可以使用request来接受请求和response响应。一个小例子: from rest_framework.decorators ...
    99+
    2023-01-31
    Django RestFramework
  • django restframework使用redis实现token认证
    目录一、前言二、详解1. 前期准备2. 配置redis3. 将token写入redis3.1 原来的登录代码3.2 重写后的登录代码3.3 登录后redis存储的用户记录4. 重写认...
    99+
    2022-11-12
  • Django RestFramework 全局异常处理详解
    目录RESTframework定义的异常一、定义异常处理类二、注册DRF框架中默认的错误处理为自己定义的类总结REST framework定义的异常 APIException 所有异...
    99+
    2022-11-13
  • django restframework序列化字段校验规则是什么
    这篇文章主要介绍“django restframework序列化字段校验规则是什么”,在日常操作中,相信很多人在django restframework序列化字段校验规则是什么问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-06-30
  • Django的restframework接口框架自定义返回数据格式的示例详解
    在前后端分离是大趋势的背景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架,用Django框架进行w...
    99+
    2022-11-11
  • django总结四:django---
    1)首先定义数据库的表名和字段 2)启动mysql数据库 bash mysql.server start 3)安装pymysql pip install pymysqlPyMySQL 是在 Python3.x 版本中用于连接 MySQL...
    99+
    2023-01-31
    django
  • django
    # Django - 中文教程文档: http://python.usyiyi.cn- anaconda使用 - conda list: 显示当前环境安装的包 - conda env list: 显示安装的虚拟环境列表 - ...
    99+
    2023-01-30
    django
  • django-7-django模型系统
    <<<常用的模型字段类型>>>https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types  InterField Char...
    99+
    2023-01-31
    模型 系统 django
  • Django--django.core.
    Django序列化时遇到错误: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE需要添加环境变量 import ...
    99+
    2023-01-30
    Django django core
  • Django-ORM
    目录一、ORM介绍二、单表操作表创建新增记录删除记录修改记录三、查询API四、基于双下滑线的模糊查询 一、ORM介绍 ORM是(对象-关系-映射)的简称:它实现了数据模型与数据库的解耦,对于数据库的操作,就不用去写原生的 SQL 语句,取...
    99+
    2019-11-30
    Django-ORM
  • Django——photo
    要点:   models   图片类型文件要使用models.ImageField(upload='文件夹名')   普通文件使用FileField   时间类型使用DatetimeField(auto_now_add=True) ...
    99+
    2023-01-30
    Django photo
  • python+django
    经过一段时间学习,用python+django写了个简单的web管理系统,第一次做这东西,水平很次还有待提高! 登录界面 每个用户用到的基本选项(可以记录登陆后的操作和一些事项,同组用户可以查看;可以修改自己用户资料;) 添加删除组(系统采...
    99+
    2023-01-31
    python django
  • Python-Django
    准备工作 新建一个Django项目 # 新建一个django项目 $ django-admin startproject mysite # 新建一个app $ django-admin startapp blog 项目的结构 ├── bl...
    99+
    2023-01-31
    Python Django
  • django logging
    LOG_LEVEL = 'DEBUG'   LOGGING = {     'version' : 1,     'disable_existing_loggers' : True,     'formatters' : {       ...
    99+
    2023-01-31
    django logging
  • django-admin和django-admin.py有什么区别
    这篇文章主要介绍“django-admin和django-admin.py有什么区别”,在日常操作中,相信很多人在django-admin和django-admin.py有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-04
  • Django-REST-Framewo
    We're going to create a simple API to allow admin users to view and edit the users and groups in the system. Project se...
    99+
    2023-01-31
    Django REST Framewo
  • Django安装
    我这里是用的windows7系统,已经安装好了Python3下面介绍怎么安装Django进入目录C:\Windows\System32搜索cmd.exe,点击cmd.exe-右键-以管理员身份运行输入如下命令:pip install Dja...
    99+
    2023-01-30
    Django
  • Django(三):HttpReques
      当一个请求连接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的视图函数。每个请求的视图函数都会返回一个HttpResponse。   HttpRequest和Http...
    99+
    2023-01-30
    Django HttpReques
  • Django之Template
    Template模板的使用帮助我们将数据对应的插入到html文档中显示给用户。 一.Template和Context对象 t = Template('My name is {{ name }}.') c = Context({'n...
    99+
    2023-01-30
    Django Template
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作