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.mzph.cn/web/51025.shtml

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

相关文章

公司的全称可以申请注册商标吗,还有什么注意!

近日有个网友找到普推知产商标老杨,发来公司全称,问这个可以申请注册商标不,看发来是“贵州**酒业有限公司”,应该是做茅台镇酒的,以前以分析过《公司全称能不能注册商标》,这次帮网友分析完做下补充。 公…

基于springboot的招聘系统的设计与实现

TOC springboot614基于springboot的招聘系统的设计与实现--论文 研究背景 近年来,由于计算机技术和互联网技术的快速发展,使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统…

编码器精度

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、影响因素二、编码器精度三、位置因素四、环境因素五、磁编码器 前言 送给大学毕业后找不到奋斗方向的你&…

Visual Studio 和 VSCode 哪个好?

选择Visual Studio还是VSCode取决于您的具体需求‌ Visual Studio (VS) 是一款功能全面的集成开发环境(‌IDE)‌,‌提供了从代码编辑、‌编译、‌调试到版本控制、‌团队协作等一整套开发工具。‌它对微软自家的技术栈(‌如.NET、…

22个最佳AI营销工具

22个最佳AI营销工具 22 best AI marketing tools to grow your business in 2024 Here are 22 AI marketing tools you need to try in 2024: Jasper AI (for copywriting) ‍Notion AI (for productivity) ‍Surfer SEO (for SEO content writing)‍ Lexica Art (for blog th…

IntelliJ IDEA 集成 ShardingSphere-JDBC 访问分库分表

背景 众所周知,IntelliJ IDEA 是 Java 领域常用的开发工具之一,IDEA Ultimate(旗舰版)或其他例如 DataGrip 等 Intellij 平台的工具都集成了对数据库的访问能力。 但是,对于做了分库分表的项目,直接使用 …

Viper读写配置文件

Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性: 设置默认值从JSON、TOML、YAML、HCL、envfile和Java properties格式…

中秋节月饼销售利用106短信群发平台业绩翻倍案例分析

在中秋节这一传统佳节,月饼作为节日的标志性食品,其销售市场竞争尤为激烈。为了在众多品牌中脱颖而出,不少月饼销售企业开始探索创新的营销方式。其中,利用106短信群发平台进行精准营销,成为众多企业实现业绩翻倍的有效…

TCP端口范围

ip_local_port_range sysctl -a | grep ip_local_port_range | head 默认情况下,net.ipv4.ip_local_port_range的默认值为32768-60999。这意味着本地应用程序可以使用的端口号范围为32768到60999。 sysctl -a | grep net.ipv4.ip_local_reserved_ports |head …

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类,C98之前我们只需要将拷贝构造以及拷贝赋值设为私有,同时只声明…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…

【学习笔记】8、脉冲波形的变换与产生

本章简略记录。 8.1 单稳态触发器(脉冲触发) 单稳态触发器 应用于 :(1)脉冲整型(2)脉冲延时 (3)定时 单稳态触发器的工作特性: 没有触发脉冲作用时&#xf…

Qt程序比较字符串Qstring是否相等

在Qt中&#xff0c;判断两个字符串是否相等&#xff0c;需要先转码一下。 如下代码&#xff1a; QString str "相等"; if(str QString::fromLocal8Bit("不相等")) {qDebug()<<"相等"; }else {qDebug()<<"不相等"; } 在…

Vue项目-三级联动的路由跳转与传参

三级联动组件的路由的跳转与传参 三级联动&#xff0c;用户可以点击的&#xff1a;一级分类、二级分类和三级分类 以商城项目为例&#xff0c;Home模块跳转到Search模块&#xff0c;以及会把用户选中的产品&#xff08;产品名字、产品ID&#xff09;在路由跳转的时候&#xff…

限量85000份!茅台文旅中秋套盒刷新酒类文创产品新高度

执笔 | 尼 奥 编辑 | 扬 灵 八月中秋来&#xff0c;暖心团圆到。 如今&#xff0c;中秋团圆佳节将至&#xff0c;又到了一年中温馨而富有诗意的传统节日。在亲朋好友团圆赏月之际&#xff0c;怎少得了举杯邀明月的一杯美酒&#xff1f; 值此&#xff0c;茅台文旅限量发售85000…

《黑神话.悟空》:一场跨越神话与现实的深度探索

《黑神话.悟空》&#xff1a;一场跨越神话与现实的深度探索 在国产游戏日益崛起的今天&#xff0c;《黑神话.悟空》以其独特的剧情、丰富的人物设定和深刻的主题&#xff0c;成为了无数玩家翘首以盼的国产3A大作。这款游戏不仅是一次对传统故事的创新演绎&#xff0c;更是一场对…

MySQL编译安装-麒麟V10 x86

环境信息 操作系统: Kylin Linux Advanced Server V10 (Sword) 架构&#xff1a;X86 MySQL版本&#xff1a;5.7.44 编译 安装必要的依赖库和编译工具 sudo yum groupinstall Development Toolssudo yum install cmake ncurses-devel openssl-devel boost-devel libtirpc li…

操作系统:内存管理策略

外部碎片 当应用程序启动时&#xff0c;由操作系统负责给该应用程序分配其内存空间&#xff0c;假设此时启动了三个应用程序&#xff0c;操作系统分别给其分配了100m&#xff0c;10m和50m的内存&#xff0c;内存情况如下图 此时如果程序B下线&#xff0c;程序A和程序C之间便会…

【css】伪元素实现图片个悬停文字聚焦效果

实现重点&#xff1a; 文字覆盖在图片上&#xff1a; 通过使用 position: absolute 将 .box 文字盒子定位在图片上方。父容器 .img-wrap 使用了 position: relative 确保子元素的绝对定位在父容器的边界内生效。 创建悬停效果&#xff1a; 通过使用 &::before 和 &::…

国富基金入股的关联性与奇瑞依赖症,大昌科技业务独立性引关注

《港湾商业观察》廖紫雯 日前&#xff0c;安徽大昌科技有限公司&#xff08;以下简称&#xff1a;大昌科技&#xff09;更新招股书并完成三轮问询&#xff0c;公司冲刺深交所创业板得到进一步进展。此前&#xff0c;2023年6月&#xff0c;大昌科技IPO获深交所受理&#xff0c;…