首页 > 其他分享 >【DRF-07】rest-framework之版本

【DRF-07】rest-framework之版本

时间:2024-05-28 20:44:38浏览次数:18  
标签:return 07 self request rest framework version class versioning

  • 1.基于url的get传参方式(不推荐)
    • 1.1:通过自定义版本控制类,获取版本
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView

class ParamVersion(object):
    def determine_version(self,request,*args,**kwargs):
        version = request._request.GET.get("version")
        return version

class UserView(APIView):
    versioning_class = ParamVersion
    def get(self,request,*args,**kwargs):
        # version = request._request.GET.get("version")
        # print(version)
        #
        # version1 = request.query_params.get("version")
        # print(version1)

        print(request.version)
        return HttpResponse("用户列表")
  • 1.2:小知识点,我们在通过request获取信息时,先看restframework中有没有,如果没有就取原生request中的方法。实现原理
class Request:
  @property
  def query_params(self):
      """
      More semantically correct name for request.GET.
      """
      return self._request.GET

  def __getattr__(self, attr):
      """
      If an attribute does not exist on this instance, then we also attempt
      to proxy it to the underlying HttpRequest object.
      """
      try:
          _request = self.__getattribute__("_request")
          return getattr(_request, attr)
      except AttributeError:
          return self.__getattribute__(attr)

  • 1.3:restframework已经有内置类帮我们实现了上面的功能
    • 1.3.1:使用
# 全局配置
REST_FRAMEWORK = {
    "DEFAULT_VERSION":"v1",
    "ALLOWED_VERSIONS":["v1","v2"],
    "VERSION_PARAM":"version",
}

# 视图
from rest_framework.versioning import URLPathVersioning,QueryParameterVersioning
class UserView(APIView):
    versioning_class = QueryParameterVersioning
    def get(self,request,*args,**kwargs):

        print(request.version)
        return HttpResponse("用户列表")
- 1.3.2:原理
class QueryParameterVersioning(BaseVersioning):
    """
    GET /something/?version=0.1 HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    invalid_version_message = _('Invalid version in query parameter.')

    def determine_version(self, request, *args, **kwargs):
        version = request.query_params.get(self.version_param, self.default_version)
        if not self.is_allowed_version(version):
            raise exceptions.NotFound(self.invalid_version_message)
        return version

    def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
        url = super().reverse(
            viewname, args, kwargs, request, format, **extra
        )
        if request.version is not None:
            return replace_query_param(url, self.version_param, request.version)
        return url
  • 2.基于url的正则方式(推荐)
    • 2.1:使用
# urls.py
from django.urls import path,re_path
from api import views
urlpatterns = [
    re_path(r'^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view()),
]

# 视图
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.versioning import URLPathVersioning,QueryParameterVersioning

class UserView(APIView):
    versioning_class = URLPathVersioning
    def get(self,request,*args,**kwargs):
        print(request.version)
        return HttpResponse("用户列表")
  • 3.源码流程
    • 3.1:还是走dispatch-->>initial
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
  • 3.2:determine_version方法
def determine_version(self, request, *args, **kwargs):
    """
    If versioning is being used, then determine any API version for the
    incoming request. Returns a two-tuple of (version, versioning_scheme)
    """
    if self.versioning_class is None:
        return (None, None)
    # 处理版本类的对象,URLPathVersioning对象
    scheme = self.versioning_class()
    return (scheme.determine_version(request, *args, **kwargs), scheme)
  • 3.3:视图中使用
# 取版本
request.version
# 取处理版本的对象
request.versioning_scheme
  • 4.反向生成url
    • 4.1:使用
urlpatterns = [
    re_path(r'^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view(),name='uuu'),
]

# 视图
from rest_framework.versioning import URLPathVersioning,QueryParameterVersioning

class UserView(APIView):
    versioning_class = URLPathVersioning
    def get(self,request,*args,**kwargs):
        print(request.version)

        u1 = request.versioning_scheme.reverse(viewname='uuu',request=request)
        print(u1)
        return HttpResponse("用户列表")

标签:return,07,self,request,rest,framework,version,class,versioning
From: https://www.cnblogs.com/xwltest/p/18218805

相关文章

  • 代码随想录算法训练Day20|LeetCode654-最大二叉树、LeetCode617-合并二叉树、LeetCode
    最大二叉树题目描述力扣654-最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。......
  • 在Spring Boot应用中使用RestTemplate类发送不同的HTTP GET请求(带请求头、不带请求头)
    原文链接:https://www.cnblogs.com/windyWu/p/16872871.html在本文中,你将学会在SpringBoot应用中使用RestTemplate类发送不同的HTTPGET请求。简单GET请求发送GETHTTP请求,可以使用getForObject()或getForEntity()方法。如下示例,使用getForObject()方法获取JSON字符串形式的用......
  • Nginx(openresty) 通过lua结合Web前端 实现图片,文件,视频等静态资源 访问权限验证,进行
    1本文系统环境:安装openresty(nginx),可参考:test@ubuntuserver:~$cat/etc/os-releasePRETTY_NAME="Ubuntu24.04LTS"NAME="Ubuntu"VERSION_ID="24.04"VERSION="24.04LTS(NobleNumbat)"VERSION_CODENAME=nobleID=ubuntuID_LIK......
  • 再次学习History.scrollRestoration
    之前在react.dev的源代码中了解到了这个HIstory的属性,当时写了一篇笔记来记录我对它的理解,现在看来还是一知半解。所以今天打算重新学习一下这个属性,主要从属性以及所属对象的介绍、使用方法,是否开启标准这几个方面来简单展开。什么是scrollRestorationscrollRestoration是一个......
  • centos7.9安装openrestry
    简介:openrestry是一个与lua脚本结合的高性能服务器一:根据官网下载安装包https://openresty.org/cn/linux-packages.html二..配置环境exportPATH=/usr/local/openresty/nginx/sbin:$PATH默认安装后的80端口会被开放,查看并杀死netstat-lnpt|grep80kill-9pid 三.简......
  • 创建一个配置为信任所有HTTPS连接的RestTemplate实例,不验证服务器的SSL证书。这个示
    这个配置类使用背景:可参考博客:springboot使用restTemplate发送https请求忽略ssl证书https://jsonll.blog.csdn.net/article/details/129191580?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-1......
  • 命令启用Windows7 .NetFramework 3.5
    最近在测试某系统安装包在各个环境下的安装使用情况,在window7下使用时,安装完成iis后,发现.NetFramework3.5没有自动勾选;命令没有执行成功。通过以下命令可以在window7下打开自带的.netframework3.5.1(CMD窗口内执行)dism/online/enable-feature/featurename:NetFx3 ......
  • Android Media Framework - 开篇
    前言AndroidMedia是一块非常庞大的内容,上到APP的书写,中到播放器的实现、封装格式的了解,下到编解码组件的封装、VPUAPI的了解,每块内容的学习都需要我们下很大的功夫。此外,我们还要对相关的模块进行了解,比如AudioFlinger、SurfaceFlinger等,他们与Media相关交织共同构建了Android......
  • 【DRF-06】rest-framework之节流
    1.自定义节流类,基于用户IP限制访问频率1.1:自定义节流类importtimeVISIT_RECORD={}classVisitThrottle(BaseThrottle):'''#(1)取出访问者ip#(2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走#(3)循......
  • [博客迁移20190713]题解 P4169 【[Violet]天使玩偶/SJY摆棋子】
    《算法竞赛》书上例题(可惜原书没代码)天使玩偶,一道好题。(书p243)我就来谈谈自己的想法吧!而总有人在这种明明可以离线处理的三维偏序问题上投机取巧。如:KDtree。蒟蒻想说,KDtree在这题复杂度是不对的。虽有剪枝,可是还是有可能遍历整棵树的(期望复杂度不靠谱)对上述看法有争议的,请跳......