访问不同版本,给不同内容。
rest规范:版本要么放url上;要么放请求头里。
1.原来的url的版本都写死了。只能写v1
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$', views.login), url(r'^app01/v1/auth/$', views.AuthView.as_view()), url(r'^app01/v1/order/$', views.OrderView.as_view()), url(r'^app01/v1/info/$', views.UserInfoView.as_view()), ]
2.创建一个django项目。
models.py:用户表、用户token表、用户分组、角色表 (结构的不同,序列化的方法也不一样。)
关系:用户表于用户token表 (1对1);用户分组(于用户表 1对多);一个角色表(于用户表 多对多);
from django.db import models # Create your models here. # 用户组 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) # 用户token表 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)
urls.py: 分发
项目下是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.conf.urls import url from django.contrib import admin from api import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^users/$', views.UsersView.as_view()), ]
views.py
from django.shortcuts import render, HttpResponse from rest_framework.views import APIView # Create your views here. class UsersView(APIView): def get(self, request, *args, **kwargs): return HttpResponse("用户列表")
项目先运行起来:
接下来,就来介绍版本内容
1.方式1:url路由传版本值
2.取版本值
3.看源码 不用自己写这么长,Request自己有取值方法。
找到Request类里面的query_params()方法
4.
5.接下来自定义一个类,类里面该写什么方法。
看源码:
BaseVersioning源码
6.from rest_framework.versioning import BaseVersioning
7.determine_version 方法
8.views.py 自定义方法获取GET的版本信息。
9. 以上都是通过url路由的GET方式传参的。我们用内置的方法。
内置版本QueryParameterVersioning
from rest_framework.versioning import QueryParameterVersioning
url访问方式:GET ?/version=1
views.py:
versioning_class = 内置版本类 (没有es,直接获取就行。)
10.内置版本源码:默认版本
11.版本限制,允许有哪些版本,不可能有v1000这样多的版本。
12.key应该动态获取。 version_param
13.
14.三个值都默认去配置文件里拿值。
1.
15.配置文件 settings.py
注意:配置完成后,传参的形式key就固定了。
不传参,默认v1
不允许的版本,浏览器访问会报错,Postman或提示 查询参数中版本无效
16.用渲染器修饰一下报错页面,先配置一下settings.py文件
运行结果:
方式2:在url中直接写版本(使用广泛)URLPathVersioning
1.from rest_framework.versioning import URLPathVersioning
2.url 加正则
3.urls.py
url(r'^(?P<version>[v1|v2]+)/users/$', views.UsersView.as_view()),
4.views.py
5.url访问方式:127.0.0.1:8000/api/v1/users/
以上是局部配置版本,只有一个视图可用。其他视图也用的话,就全局配置。
全局配置版本
1.
2.settings.py
3.各个视图就不用一一设置了。
versioning_scheme 的功能:反向生产url
0.源码:全局版本URLPathVersioning内置类, 还有一个方法reverse() 用于反向生成url
1.urls.py 定义url别名:name='sersions'
2.views.py 根据别名反向生成。
3.http://127.0.0.1:8010/api/v1/users/发送getqingqiu
打印结果:内置反向生成url.
4.django自定义的 与 rest_framework内置版本类 反向生成url 的比较。
5.rest_framework内置版本类 源码:reverse方法 继承了父类的 version方法