0
点赞
收藏
分享

微信扫一扫

rest_framework之版本详解 04

访问不同版本,给不同内容。

 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("用户列表")

项目先运行起来:

rest_framework之版本详解 04_django

接下来,就来介绍版本内容

1.方式1:url路由传版本值

rest_framework之版本详解 04_自定义_02

2.取版本值

rest_framework之版本详解 04_django_03

3.看源码   不用自己写这么长,Request自己有取值方法。

rest_framework之版本详解 04_django_04

 找到Request类里面的query_params()方法

rest_framework之版本详解 04_配置文件_05

4.

rest_framework之版本详解 04_django_06

5.接下来自定义一个类,类里面该写什么方法。

看源码:

rest_framework之版本详解 04_自定义_07

BaseVersioning源码

6.from rest_framework.versioning import BaseVersioning

rest_framework之版本详解 04_自定义_08

7.determine_version 方法

rest_framework之版本详解 04_django_09

8.views.py  自定义方法获取GET的版本信息。

rest_framework之版本详解 04_django_10

9. 以上都是通过url路由的GET方式传参的。我们用内置的方法。

内置版本QueryParameterVersioning

from rest_framework.versioning import QueryParameterVersioning

url访问方式:GET ?/version=1

rest_framework之版本详解 04_django_11

views.py:
versioning_class = 内置版本类 (没有es,直接获取就行。)

rest_framework之版本详解 04_自定义_12

10.内置版本源码:默认版本

rest_framework之版本详解 04_自定义_13

11.版本限制,允许有哪些版本,不可能有v1000这样多的版本。

rest_framework之版本详解 04_配置文件_14

12.key应该动态获取。  version_param

rest_framework之版本详解 04_django_15

13.

rest_framework之版本详解 04_django_16

14.三个值都默认去配置文件里拿值。

1.

rest_framework之版本详解 04_django_17

15.配置文件  settings.py

rest_framework之版本详解 04_自定义_18

注意:配置完成后,传参的形式key就固定了。

rest_framework之版本详解 04_自定义_19

不传参,默认v1

rest_framework之版本详解 04_配置文件_20

不允许的版本,浏览器访问会报错,Postman或提示 查询参数中版本无效

rest_framework之版本详解 04_django_21

16.用渲染器修饰一下报错页面,先配置一下settings.py文件

rest_framework之版本详解 04_自定义_22

运行结果:

rest_framework之版本详解 04_django_23

 方式2:在url中直接写版本(使用广泛)URLPathVersioning

1.from rest_framework.versioning import URLPathVersioning  

2.url 加正则

rest_framework之版本详解 04_django_24

3.urls.py  

url(r'^(?P<version>[v1|v2]+)/users/$', views.UsersView.as_view()),

rest_framework之版本详解 04_配置文件_25

4.views.py

rest_framework之版本详解 04_配置文件_26

5.url访问方式:127.0.0.1:8000/api/v1/users/

rest_framework之版本详解 04_django_27

以上是局部配置版本,只有一个视图可用。其他视图也用的话,就全局配置。

全局配置版本

1.

rest_framework之版本详解 04_自定义_28

2.settings.py

rest_framework之版本详解 04_自定义_29

3.各个视图就不用一一设置了。

rest_framework之版本详解 04_自定义_30

versioning_scheme  的功能:反向生产url

0.源码:全局版本URLPathVersioning内置类, 还有一个方法reverse()  用于反向生成url

rest_framework之版本详解 04_配置文件_31

1.urls.py  定义url别名:name='sersions'

rest_framework之版本详解 04_配置文件_32

2.views.py 根据别名反向生成。

rest_framework之版本详解 04_django_33

3.http://127.0.0.1:8010/api/v1/users/发送getqingqiu

打印结果:内置反向生成url.

rest_framework之版本详解 04_自定义_34

4.django自定义的 与 rest_framework内置版本类 反向生成url 的比较。

rest_framework之版本详解 04_django_35

5.rest_framework内置版本类 源码:reverse方法 继承了父类的 version方法

rest_framework之版本详解 04_django_36

 



举报

相关推荐

0 条评论