Django接口_django中几个html互相跳转

Django接口_django中几个html互相跳转前言在RESTful规范中,有关版本的问题,用restful规范做开放接口的时候,用户请求API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

  在RESTful规范中,有关版本的问题,用restful规范做开放接口的时候,用户请求API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升级必不可少,但是,作为平台开发者,应该知道:一旦API开放出去,有人开始用了,平台的任何改动都需要考虑对当前用户的影响。因此,做开放平台,从第一个API的设计就需要开始API的版本控制策略问题,API的版本控制策略就像是开放平台和平台用户之间的长期协议,其设计的好坏将直接决定用户是否使用该平台,或者说用户在使用之后是否会因为某次版本升级直接弃用该平台。
 

1.配置

有两种配置方案,一种是在settings中全局配置,第二种是在视图中指定,不过此方法一般不使用,因为版本控制大部分情况下是全局的处理情况
 

1.1全局配置

settings.py

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': None,
    'DEFAULT_VERSION': None,
    'ALLOWED_VERSIONS': None,
    'VERSION_PARAM': 'version',
}
  • DEFAULT_VERSIONING_CLASS:指定版本控制的类,譬如:'rest_framework.versioning.NamespaceVersioning',有多种方式。默认为None,为None时,框架变量request.version将始终返回None
  • DEFAULT_VERSION:当版本控制信息不存在时用于设置request.version的默认值,默认设置为None
  • ALLOWED_VERSIONS:允许的版本号,譬如:['v1', 'v2']。区分大小写,如果请求的版本号不在此列表中,抛出错误,上述的 DEFAULT_VERSION 的值必须是列表中的值,None除外
  • VERSION_PARAM:版本控制参数的字符串,默认就是version,一般不修改
     

1.2视图配置

views.py

# 仅仅指定 版本控制类    
class ProfileList(APIView):
    # 指定 版本控制类
    versioning_class = versioning.QueryParameterVersioning

 

2.drf内置的5个版本控制类

  • AcceptHeaderVersioning
  • URLPathVersioning
  • NamespaceVersioning
  • HostNameVersioning
  • QueryParameterVersioning
     

2.1AcceptHeaderVersioning

基于请求头的版本控制,这种方式也是最推荐的方式
 
1.http访问方式

GET /bookings/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0

在上面的示例请求中request.version属性将返回字符串’1.0’。 基于accept headers 的版本控制通常被认为是最佳实践,尽管其他版本控制方式可能适合你的客户端需求。
 
2.settings

REST_FRAMEWORK = {
	'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
        'DEFAULT_VERSION': 'v1',
        'ALLOWED_VERSIONS': ['v1', 'v2'],
}

说明:

  • 设置版本控制类为AcceptHeaderVersioning
  • 没有检测到version时,默认是v1版本
  • 允许的2个版本型号为:['v1', 'v2']

3.serializers

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookInfo
        fields = ['title', 'pub_date', 'read', 'comment', 'image']


class BookSerializerV2(serializers.ModelSerializer):
    class Meta:
        model = BookInfo
        fields = ['title', 'pub_date', 'read', 'comment']

说明:

  • 根据不同的版本号,可以对response返回内容进行控制,我们设置2个不同的Book模型的serializer类对应不同的版本
  • 2个序列化类返回的字段不同
  • BookSerializerV2fields中没有包含 image ,那么就应该把属性定义去掉,不然会抛出错误

4.views

class BookView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    def get_serializer_class(self):
        if self.request.version == "v2":
            return BookSerializerV2
        return self.serializer_class

说明:

  • 修改BookView类,重载get_serializer_class方法
  • 通过 self.request.version 获取捕获到的版本号进行控制

5.访问
我们在请求头中添加字段Accept:application/json;version=v1,就会返回BookSerializer的序列化字段,也就是有image字段
Django接口_django中几个html互相跳转
我们在请求头中添加字段Accept:application/json;version=v2,就会返回BookSerializerV2的序列化字段,也就是没有image字段
Django接口_django中几个html互相跳转
 

2.2URLPathVersioning

此方案要求客户端将版本指定为URL路径的一部分。

1.http访问方式

GET /v1/bookings/ HTTP/1.1
Host: example.com
Accept: application/json

说明:

  • 版本控制出现在url路径中,但是具体的这个 v1 出现在哪个部分,取决于url路由配置中的情况

2.settings

REST_FRAMEWORK = {
	'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',
        'ALLOWED_VERSIONS': ['v1', 'v2'],
}

3.urls
子应用的urls.py中:

urlpatterns = [
    path('<str:version>/books/', views.BookView.as_view()),
]

说明:
设置版本控制在最后,访问url是类似:http://127.0.0.1:8000/api/v2/books/

4.访问
我们在配置好url后,在url中输入v1,就会访问v1版本的接口
Django接口_django中几个html互相跳转
url中输入v2,就会访问v2版本的接口
Django接口_django中几个html互相跳转
 

2.3NamespaceVersioning

  对于客户端,此方案与URLPathVersioning相同。唯一的区别是,它是如何在 Django 应用程序中配置的,因为它使用URL conf中的命名空间而不是URL conf中的关键字参数。
  使用此方案,request.version属性是根据与传入请求的路径匹配的 namespace 确定的。
  如果你只需要一个简单的版本控制方案URLPathVersioningNamespaceVersioning都是合适的。URLPathVersioning这种方法可能更适合小型项目,对于更大的项目来说NamespaceVersioning可能更容易管理。

1.http访问方式

GET v1/something/ HTTP/1.1
Host: example.com

2.settings

REST_FRAMEWORK = {
	'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',
        'DEFAULT_VERSION': 'v1',
        'ALLOWED_VERSIONS': ['v1', 'v2'],
}

3.urls
根urls.py中:

urlpatterns = [
    path('v1/api/', include('api.urls', namespace='v1')),
    path('v2/api/', include('api.urls', namespace='v2')),
]

说明:

  • 增加了2个v1v2的不同的路由配置

4.访问
访问v1版本
Django接口_django中几个html互相跳转
访问v2版本
Django接口_django中几个html互相跳转
 

其余HostNameVersioningQueryParameterVersioning用的不多,想了解的可以查询官方文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164871.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Please upgrade the installed version of powershell to the minimum required version and run the comma…

    Please upgrade the installed version of powershell to the minimum required version and run the comma…

    2021年10月28日
    46
  • 读《Spark 大数据实例开发教程》

    读《Spark 大数据实例开发教程》这本讲spark使用的书,非常基础,命令讲的也详细。很适合现在的我。幸运地能读到。

    2022年5月2日
    44
  • Spring Data JPA插入

    Spring Data JPA插入save 方法是面向业务的 每次插入都需要验证当前数据是否为新数据 Transactiona SextendsT Ssave Sentity if this entityInform isNew entity this em persist entity SextendsT

    2025年8月25日
    4
  • idea汉化之后打不开settings解决方法

    idea汉化之后打不开settings解决方法用解压软件打开汉化包,进入messages目录,找到settings的配置文件:VcsBundle.properties以及定位的配置文件:UIBundle.properties将这两个文件删掉重新启动IDEA即可完美解决,感谢这位前辈。…

    2022年5月30日
    44
  • 广东公布重点项目名单:茂名天源石化碳三碳四资源利用项目等[通俗易懂]

    广东公布重点项目名单:茂名天源石化碳三碳四资源利用项目等[通俗易懂]广东省发展改革委官网3月31日公布《广东省2021年重点建设项目计划》。2021年广东共安排省重点项目1395个,总投资达7.28万亿元,年度计划投资8000亿元。石化重大项目方面:新开工项目有3个,总投资约267亿元,年度投资约60.5亿元,分别是恒力石化(惠州)PTA项目、东华能源(茂名)烷烃资源综合利用项目(一期)、茂名天源石化碳三碳四资源利用项目。续建项目有7个,总投资超过1500亿元,2021年度投资约160.9亿元。分别是埃克森美孚惠州乙烯项目、惠州石化产品结构优化及升级项目、惠州宇新轻

    2022年10月15日
    4
  • Java xml数据格式返回实现

    Java xml数据格式返回实现前言:对于服务器后端开发,实现的大部分接口,返回的数据格式一般要求都是json,但是也有使用xml格式的网上有多种实现方式,这里使用注解的方式把java类使用@RequestBody实现Java对象和XML/JSON数据自动转换很多人会认为接口方法使用@Controller搭配@ResponseBody和@RequestMapping注解后,java对象会转换成json格式返回。但实际上配…

    2022年7月20日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号