DRF——请求的封装与版本管理

文章目录

    • django restframework
      • 1. 快速上手
      • 2. 请求数据的封装
      • 3. 版本管理
        • 3.1 URL的GET参数传递(*)
        • 3.2 URL路径传递(*)
        • 3.3 请求头传递
        • 3.4 二级域名传递
        • 3.5 路由的namespace传递
      • 小结

django restframework

  • 快速上手
  • 请求的封装
  • 版本管理
  • 认证
  • 权限
  • 限流
  • 序列化
  • 视图
  • 条件搜索
  • 分页
  • 路由
  • 解析器

1. 快速上手

  • 安装

    pip install djangorestframework==3.12.4
    
    版本要求:djangorestframework==3.12.4Python (3.5, 3.6, 3.7, 3.8, 3.9)Django (2.2, 3.0, 3.1)版本要求:djangorestframework==3.11.2Python (3.5, 3.6, 3.7, 3.8)Django (1.11, 2.0, 2.1, 2.2, 3.0)
    
  • 配置,在settings.py中添加配置

    INSTALLED_APPS = [...# 注册rest_framework(drf)'rest_framework',
    ]# drf相关配置以后编写在这里 
    REST_FRAMEWORK = {}
    
  • URL和视图

    # urls.pyfrom django.urls import path
    from app01 import viewsurlpatterns = [path('users/', views.UserView.as_view()),
    ]
    
    # views.py
    from rest_framework.views import APIView
    from rest_framework.response import Responseclass UserView(APIView):def get(self, request, *args, **kwargs):return Response({"code": 1000, "data": "xxx"})def post(self, request, *args, **kwargs):return Response({"code": 1000, "data": "xxx"})
    

其实drf框架是在django基础进行的扩展,所以上述执行过得底层实现流程(同django的CBV):
在这里插入图片描述

drf中重写了 as_viewdispatch方法,其实就是在原来django的功能基础上添加了一些功能,例如:

  • as_view,免除了csrf 验证,一般前后端分离不会使用csrf token认证(后期会使用jwt认证)。
  • dispatch,内部添加了 版本处理、认证、权限、访问频率限制等诸多功能(后期逐一讲解)。

在前后端不分离项目中要解决post,put,delete的crsf问题时:通常会在表单中加入{% csrf_token %}

在这里插入图片描述

而如果是在前后端分离项目中就不可行了,此时就需要csrf_exempt装饰器:

在这里插入图片描述

2. 请求数据的封装

drf的request是 原来django的request与认证,解析等对象一起封装后的对象。

以前我们通过django开发项目时,视图中的request是 django.core.handlers.wsgi.WSGIRequest 类的对象,其中包含了请求相关的所有数据。

# Django FBV
def index(request):request.methodrequest.POSTrequest.GETrequest.body# Django CBV
from django.views import View
class UserView(View):def get(self,request):request.methodrequest.POSTrequest.GETrequest.body

而在使用drf框架时,视图中的request是rest_framework.request.Request类的对象,其是又对django的request进行了一次封装,包含了除django原request对象以外,还包含其他后期会使用的其他对象。

from rest_framework.views import APIView
from rest_framework.response import Responseclass UserView(APIView):def get(self, request, *args, **kwargs):# request,不再是django中的request,而是又被封装了一层,内部包含:django的request、认证、解析器等。return Response({"code": 1000, "data": "xxx"})def post(self, request, *args, **kwargs):return Response({"code": 1000, "data": "xxx"})
对象 = (request, 其他数据)
# rest_framework.request.Request 类class Request:"""Wrapper allowing to enhance a standard `HttpRequest` instance.Kwargs:- request(HttpRequest). The original request instance. (django中的request)- parsers(list/tuple). The parsers to use for parsing therequest content.- authenticators(list/tuple). The authenticators used to tryauthenticating the request's user."""def __init__(self, request, parsers=None, authenticators=None,negotiator=None, parser_context=None):self._request = requestself.parsers = parsers or ()self.authenticators = authenticators or ()...@propertydef query_params(self):"""More semantically correct name for request.GET."""return self._request.GET@propertydef data(self):if not _hasattr(self, '_full_data'):self._load_data_and_files()return self._full_datadef __getattr__(self, attr):try:return getattr(self._request, attr) # self._request.methodexcept AttributeError:return self.__getattribute__(attr)

所以,在使用drf框架开发时,视图中的request对象与原来的有些不同,例如:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.views import View
from rest_framework.request import Requestclass UserView(APIView):def get(self, request, *args, **kwargs):# 通过对象的嵌套直接找到原request,读取相关值request._request.methodrequest._request.GETrequest._request.POSTrequest._request.body# 举例:content-type: url-form-encodedv1=123&v2=456&v3=999django一旦读取到这个请求头之后,就会按照 {"v1":123,"v2":456,"v3":999}content-type: application/json{"v1":123,"v2":456}request._request.POSTrequest._request.body# 直接读取新request对象中的值,一般此处会对原始的数据进行一些处理,方便开发者在视图中使用。request.query_params  # 内部本质上就是 request._request.GETrequest.data # 内部读取请求体中的数据,并进行处理,例如:请求者发来JSON格式,他的内部会对json字符串进行反序列化。# 通过 __getattr__ 去访问 request._request 中的值request.method

底层源码实现:

在这里插入图片描述

3. 版本管理

在restful规范中要去,后端的API中需要体现版本。

drf框架中支持5种版本的设置。(重点是前两种:参数传递,URL路径传递)

3.1 URL的GET参数传递(*)

在这里插入图片描述

# settings.pyREST_FRAMEWORK = {"VERSION_PARAM": "v","DEFAULT_VERSION": "v1","ALLOWED_VERSIONS": ["v1", "v2", "v3"],"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning"
}

源码执行流程:

在这里插入图片描述

3.2 URL路径传递(*)

在这里插入图片描述

3.3 请求头传递

在这里插入图片描述

3.4 二级域名传递

在这里插入图片描述

在使用二级域名这种模式时需要先做两个配置:

  • 域名需解析至IP,本地可以在hosts文件中添加
    在这里插入图片描述

    127.0.0.1       v1.wupeiqi.com
    127.0.0.1       v2.wupeiqi.com
    
  • 在django的settings.py配置文件中添加允许域名访问

    ALLOWED_HOSTS = ["*"]
    
3.5 路由的namespace传递

在这里插入图片描述

以上就是drf中支持的5种版本管理的类的使用和配置。

全局配置

上述示例中,如果想要应用某种 版本 的形式,需要在每个视图类中定义类变量:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioningclass UserView(APIView):versioning_class = QueryParameterVersioning...

如果你项目比较大,需要些很多的视图类,在每一个类中都写一遍会比较麻烦,所有drf中也支持了全局配置。

# settings.pyREST_FRAMEWORK = {"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",  # 处理版本的类的路径"VERSION_PARAM": "version",  # URL参数传参时的key,例如:xxxx?version=v1"ALLOWED_VERSIONS": ["v1", "v2", "v3"],  # 限制支持的版本,None表示无限制"DEFAULT_VERSION": "v1",  # 默认版本
}

在这里插入图片描述

底层源码实现

在这里插入图片描述

反向生成URL

使用drf是可以通过request.versioning_scheme.reverse(viewname, args, kwargs, request)来反向生成URL

在每个版本处理的类中还定义了reverse方法,他是用来反向生成URL并携带相关的的版本信息用的,例如:

在这里插入图片描述

在这里插入图片描述

小结

以后使用drf开发后端API接口时:

  1. 创建django程序
  2. 安装drf框架
  3. 创建一个app专门来处理用户的请求
  4. 注册APP
  5. 设置版本
  6. 编写视图类
  • 请求的封装
  • 版本的处理
    • 过程:选择版本处理类,获取用户传入的版本信息
    • 结果:在 request.version = 版本request.versioning_scheme=版本处理类的对象

若有错误与不足请指出,关注DPT一起进步吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409285.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科大讯飞刘聪:大模型加持,人形机器人将跨越三大瓶颈

2024年,AI大模型成为机器人产业新的加速器。 今年3月,ChatGPT4加持的机器人Figure01向外界展示了大模型赋能人形机器人的巨大潜力。Figure01能理解周围环境,流畅地与人类交谈,理解人类的需求并完成具体行动,包括给人类…

虚幻5|AI视力系统,听力系统,预测系统(2)听力系统

虚幻5|AI视力系统,听力系统,预测系统(1)视力系统-CSDN博客 一,把之前的听力系统,折叠成函数,复制粘贴一份改名为听力系统 1.小个体修改如下,把之前的视力系统改成听力系统 2.整体修…

隐私指纹浏览器产品系列 —— 浏览器指纹 中(三)

1.引言 在上一篇文章中,我们聊到了最老牌的浏览器指纹检测站——BrowserLeaks。BrowserLeaks曾经是浏览器指纹检测的权威,但它似乎更像是一本老旧的工具书,只能呆板告诉你浏览器的指纹值,并对比不同浏览器的指纹差异。 今天&…

C语言 之 浮点数在内存中的存储 详细讲解

文章目录 浮点数浮点数的存储浮点数的存储浮点数的读取例题 浮点数 常见的浮点数:3.14159、1E10(表示1*10^10)等 浮点数家族包括: float、double、long double 类型。 浮点数表示的范围在float.h 中有定义 浮点数的存储 浮点数…

C++研发笔记1——github注册文档

1、第一步:登录网站 GitHub: Let’s build from here GitHub 最新跳转页面如下: 2、选择“sign up”进行注册,并填写设置账户信息 3、创建账户成功之后需要进行再次登录 4、根据实际情况填写个人状态信息 登录完成后页面网站: 5…

手写SpringAOP

一、非注解式简易版AOP 整体流程 1.1 代码 public class Test {public static void main(String[] args){// Aop代理工厂DefaultAopProxyFactory factory new DefaultAopProxyFactory();// 测试对象AOPDemoImpl demo new AOPDemoImpl();// 支撑类:用于存放目标…

配置策略路由实战 附带基础网络知识

背景 作为一个软件开发人员,不可能做到只负责业务开发工作,一旦功能上线或者系统切换就会遇到非常多考验开发人员个人能力的场景,网络调整就是非常重要的一个方面,如果你在系统上线的过程中无法处理一些简单的网络问题或者听不懂…

文件包含漏洞(1)

目录 PHP伪协议 php://input Example 1&#xff1a; 造成任意代码执行 Example 2&#xff1a; 文件内容绕过 php://filer zip:// PHP伪协议 php://input Example 1&#xff1a; 造成任意代码执行 搭建环境 <meta charset"utf8"> <?php error_repo…

Modern C++——不准确“类型声明”引发的非必要性能损耗

大纲 案例代码地址 C是一种强类型语言。我们在编码时就需要明确指出每个变量的类型&#xff0c;进而让编译器可以正确的编译。看似C编译器比其他弱类型语言的编译器要死板&#xff0c;实则它也做了很多“隐藏”的操作。它会在尝试针对一些非预期类型进行相应转换&#xff0c;以…

QT Quick QML 网络助手——TCP客户端

GitHub 源码: QmlLearningPro &#xff0c;选择子工程 Nettools.pro QML 其它文章请点击这里: QT QUICK QML 学习笔记 ● 运行效果&#xff1a; 左侧为常用的网络调试工具&#xff0c;右侧为本项目 UI 效果&#xff0c;前端使用 QML &#xff0c;后端使用C &#xff…

【文档智能 RAG】浅看开源的同质化的文档解析框架-Docling

前言 RAG的兴起&#xff0c;越来越多的人开始关注文档结构化解析的效果&#xff0c;这个赛道变得非常的同质化。 关于文档智能解析过程中的每个技术环节的技术点&#xff0c;前期文章详细介绍了很多内容&#xff1a; 下面我们简单的看看Docling这个PDF文档解析框架里面都有什…

GPIO(通用输入/输出)、中断(hal库)

目录 GPIO&#xff08;通用输入/输出)&#xff08;hal库&#xff09; GPIO工作模式 推挽输出&#xff08;Push-Pull Output&#xff09; 开漏输出&#xff08;Open-Drain Output&#xff09; 复用推挽输出&#xff08;Alternate Function Push-Pull Output&#xff09; 复…

在Ubuntu 22.04测试ebpf-go入门例子

文章目录 1、eBPF-Go依赖1.1 Ubuntu安装ssh server1.2 安装go1.3 安装llvm和clang1.4 安装libbpf和Linux kernel headers 2 编写eBPF C程序3 使用bpf2go编译eBPF C程序4 编写Go程序5 编译运行Go应用程序 eBPF-Go是一个使用eBPF的Go库。它不依赖于C、libbpf或除标准库之外的任何…

Windows单机安装配置mongodb+hadoop+spark+pyspark用于大数据分析

目录 版本选择安装配置Java环境配置Hadoop配置Spark配置 安装pyspark使用Jupyter Notebook进行Spark MongoDB测试参考 版本选择 根据Spark Connector&#xff1a;org.mongodb.spark:mongo-spark-connector_2.13:10.3.0 的前提要求 这里选择使用最新的MongoDB 7.0.12社区版 ht…

基于R语言进行AMMI分析3

参考资料&#xff1a;https://cran.r-project.org/web/packages/agricolae/agricolae.pdf 1、plot()函数 本次介绍的是Agricolae包中的plot.AMMI()函数。此函数可以绘制AMMI双标图&#xff0c;也可以绘制三标图&#xff08;三个坐标轴&#xff0c;IPCA1&#xff0c;IPCA2&…

TiggerRamDisk绕过激活界面,支持最新iOS17.4.1绕过

&#x1f427;技术交流&#xff1a;582022476 ——————— iOS15等待越狱的日子实在太久了&#xff01;checkra1n越狱目前还未发布iOS15系统越狱。 可很多朋友不小心或者大意已经升级到了最新iOS15系统。一般来说这并没有什么大碍&#xff0c;但如果是绕过激活的设备&#…

Cesium 展示——绘制水面动态升高

文章目录 需求分析需求 如图,绘制水面动态升高,作为洪水淹没的效果 分析 我们首先需要绘制一个面然后给这个面一个高度,在回调函数中进行动态设置值【这里有两种,一种是到达水面一定高度停止升高,一种是水面重新升高】/*** @description :洪水淹没* @author : Hukang*…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

工厂现场多功能帮手,三防平板改善管理体验

随着制造业的智能化变革&#xff0c;信息化、自动化和智能化逐渐成为工厂管理的新常态。在这一波技术浪潮中&#xff0c;三防平板作为一种多功能的工作工具&#xff0c;正在逐步改善工厂现场的管理体验。 一、三防平板的定义与特点 三防平板&#xff0c;顾名思义&#xff0c;是…

Python测试框架之—— pytest介绍与示例

Pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 一、Pytest的特点 简单灵活&#xff1a;Pytest的语法简洁清晰&#xff0c;容易上手&#xff0c;并且支持复杂的测试场景。自动发…