版本
新建一个工程Myproject和一个app名为api
api/models.py 数据结构如下:
from django.db import models class UserGroup(models.Model): title = models.CharField(max_length=32) class UserInfo(models.Model): user_type_choices = ( (1,'普通用户'), (2,'VIP'), (3,'SVIP'), ) user_type = models.IntegerField(choices=user_type_choices) username = models.CharField(max_length=32,unique=True) password = models.CharField(max_length=64) group = models.ForeignKey("UserGroup") roles = models.ManyToManyField("Role") class UserToken(models.Model): user = models.OneToOneField(to='UserInfo') token = models.CharField(max_length=64) class Role(models.Model): title = models.CharField(max_length=32)
Myproject/urls.py
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^api/', include('api.urls')), ]
api/urls.py
from django.urls import path from .views import UserView urlpatterns = [ url('users/$', UserView.as_view()), ]
views.py
from django.shortcuts import render,HttpResponse from rest_framework.views import APIView from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning class UserView(APIView): versioning_class = QueryParameterVersioning def get(self,request,*args,**kwargs): #获取版本 print(request.version) return HttpResponse('用户列表')
settings.py
REST_FRAMEWORK = { "DEFAULT_VERSION":'v1', #默认的版本 "ALLOWED_VERSIONS":['v1','v2'], #允许的版本 "VERSION_PARAM":'version' #GET方式url中参数的名字 ?version=xxx }
1.url中通过GET传参
QueryParameterVersioning用于去GET参数中取version
访问
http://127.0.0.1:8000/api/users/?version=v2
后台可以看到当前的版本
如果url中没有传版本参数,则显示默认的版本("DEFAULT_VERSION":'v1')
访问
http://127.0.0.1:8000/api/users/
如果url传的版本超过settings中的允许范围则报错
访问
http://127.0.0.1:8000/api/users/?version=v3
2.在URLPATH中获取
(1)修改api/urls.py
通常情况我门应该用URLPATH的方式,而不是用前面GET()传参方式
url里面通过正则表达式定义哪些版本,
urlpatterns = [ url('(?P<version>[v1|v2]+)/users/$', views.UserView.as_view()), ]
(2)views.py
URLPathVersioning:去url路径里面获取版本
修改 UserView 类视图 代码如下
from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning class UserView(APIView): versioning_class = URLPathVersioning def get(self,request,*args,**kwargs): #获取版本 print(request.version) return HttpResponse('用户列表')
浏览器访问地址
http://127.0.0.1:8000/api/v1/users/
然后后台拿到版本信息
这个URLPathVersioning我们可以放到settings里面,全局配置,就不用写到views里面,每个类都要写一遍了
settings.py
# 版本 # REST_FRAMEWORK = { # "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning", # "DEFAULT_VERSION":'v1', #默认的版本 # "ALLOWED_VERSIONS":['v1','v2'], #允许的版本 # "VERSION_PARAM":'version' #get方式url中参数的名字 ?version=xxx # } #全局 REST_FRAMEWORK = { "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning", }
修改views.py
class UserView(APIView): def get(self,request,*args,**kwargs): #获取版本 print(request.version) return HttpResponse('用户列表')
我们可以得到同样的结果