zoukankan      html  css  js  c++  java
  • 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("用户列表")

    项目先运行起来:

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

    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方法

  • 相关阅读:
    周记
    读书笔记
    我是一只IT小小鸟
    回车键完全替代模拟鼠标单击事件
    去除Flexgrid表格的隔行底色为白的样式
    Flexgrid中的sortable设为false的时候abbr属性也不存在的原因及解决办法
    Flexigrid列之间的拖拉线条在某些浏览器中不能很好地与栏目边缘重合解决方法介绍
    用基于openssl产生的密钥实现PHP和.NET端的RSA加解密互通
    CSS3轮播图
    淘宝放大镜
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9306695.html
Copyright © 2011-2022 走看看