zoukankan      html  css  js  c++  java
  • Restframework的版本及分页

    1.版本

    1.1基于url的get传参方式

    1.创建django项目(起名我的是version),再创建一个app01应用

    创建完成,通过python3 manage.py startapp api 命令创建一个api应用

    注意:创建完后一定要在setting中进行配制:

    这里必须强调这点,因为如果忘记,后期在api下models.py下创建的数据就无法迁移至数据路中

    api/models.py(自行添加数据)

    from django.db import models
    
    class Userinfo(models.Model):
    	user_type = (
    		(1,'青铜'),
    		(2,'黄金'),
    		(3,'钻石'),
    	)
    	user_type = models.IntegerField(choices=user_type)
    	username = models.CharField(max_length=32)
    	password = models.CharField(max_length=64)
    

      version/urls.py

    from django.conf.urls import url,include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    	url('api/', include('api.urls')),
    ]
    

      api/urls.py

    from django.conf.urls import url
    from api.views import UserView
    
    urlpatterns = [
    	url(r'users/', UserView.as_view()),
    ]
    

      api/views.py(QueryParameterVersioning用于去GET参数中取version)

    from django.shortcuts import render,HttpResponse
    from rest_framework.views import APIView
    from rest_framework.versioning import QueryParameterVersioning
    
    class UserView(APIView):
    	# 实例化QueryParameterVersioning这个类
    	versioning_class = QueryParameterVersioning
    
    	def get(self,request,*args,**kwargs):
    		print(request.version)
    		return HttpResponse('ok')
    

      setting.py(注意这里的写法)

    #版本
    REST_FRAMEWORK = {
        "DEFAULT_VERSION":'v1',               #默认的版本
        "ALLOWED_VERSIONS":['v1','v2'],       #允许的版本
        "VERSION_PARAM":'version'             #GET方式url中参数的名字  ?version=xxx
    }
    

      启动:

    默认情况下版本v1

     指定其他版本则把报错

    1.2 在全局setting配置版本信息------------>常用

    修改api/urls.py----->这里利用了有名分组

    from django.conf.urls import url
    from api.views import UserView
    
    urlpatterns = [
    	url(r'(?P<version>w+)/users/', UserView.as_view()),
    ]

    注释掉我们在views.py下之前的实例化

    from django.shortcuts import render,HttpResponse
    from rest_framework.views import APIView
    
    class UserView(APIView):
    	# 实例化QueryParameterVersioning这个类
    	# versioning_class = QueryParameterVersioning
    
    	def get(self,request,*args,**kwargs):
    		print(request.version)
    		return HttpResponse('ok')

     全局下的setting.py配置

    REST_FRAMEWORK = {
        # 版本相关信息
        'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
        'VERSION_PARAM':'version',  # 这里的这个名字必须和我们的有名分组名称一致
        'DEFAULT_VERSION':'v1',
        'ALLOWED_VERSIONS':['v1','v2'],
    }

      启动运行:

     不存在则报错

     

    2.版本与分页

      创建django框架,创建我们的app(app01),我这里创建django默认创建了这个,再创建一个接口app(api),注意这里的每一个应用都是一个包,都应该包含__init__文件

      创建完后需要在setting中INSTALLED_APPS下手动添加我们的app('api.apps.ApiConfig','app01.apps.App01Config',),必须要有这两个app,记得检查下

      另外再添加一个渲染器 'rest_framework',用于最后渲染我们的页面

      api文件构造:

      在api的models下创建字段:(创建完后自己添加几条数据)

    class Course(models.Model):
        """专题课/学位课模块表"""
        name = models.CharField(max_length=128, unique=True)
    

      api的urls.py下创建路由:

    from django.conf.urls import url
    from api.views import course
    
    
    urlpatterns = [
        url(r'courses/$',course.CoursesView.as_view()),
        ]
    

     serializers下的course.py:

    from rest_framework import serializers
    
    # 对course字段序列化
    class CourseSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        name = serializers.CharField()
    

      utils下的response.py

    class BaseResponse(object):
    
        def __init__(self):
            self.code = 1000
            self.data = None
            self.error = None
    
        @property
        def dict(self):
            return self.__dict__
    

     views下的course.py

    from api import models
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.pagination import PageNumberPagination
    from api.utils.response import BaseResponse
    from api.serializers.course import CourseSerializer
    
    # 分页器
    class CoursesView(APIView):
    	def get(self, request, *args, **kwargs):
    		# 一个返回状态信息的类
    		ret = BaseResponse()
    		try:
    			queryset = models.Course.objects.all()
    			# 分页
    			page = PageNumberPagination()   # 实例化
    			# 引用源码提供的方法,最终返回列表类型的数据
    			course_list = page.paginate_queryset(queryset,request,self)
    			# 分页后将结果序列化
    			ser = CourseSerializer(instance=course_list,many=True)
    			# 给我们的对象传值
    			ret.data = ser.data
    		except Exception as e:
    			ret.code = 500
    			ret.error = "获取数据失败"
    
    		return Response(ret.dict)
    

      以上api中的构造基本完成,我们的总路由(与setting同级目录下)的urls.py:

    from django.conf.urls import url,include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/(?P<version>w+)/',include('api.urls')),
    ]
    

      最终,我们事先版本以及分页效果,还要在setting下添加一下配置信息:

    REST_FRAMEWORK = {
        # 版本相关信息
        'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
        'VERSION_PARAM':'version',
        'DEFAULT_VERSION':'v1',
        'ALLOWED_VERSIONS':['v1','v2'],
        # 分页相关信息,数字代表一页几条数据
        'PAGE_SIZE':2
    }
    

      ok。效果如下:

      我们只添加了两个版本v1和v2,现在改成v3:

  • 相关阅读:
    【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
    【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
    【Azure 应用服务】Azure Function 不能被触发
    【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
    【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
    【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达
    【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)
    【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
    【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
    【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9426901.html
Copyright © 2011-2022 走看看