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:

  • 相关阅读:
    怎样修改原型对象prototype
    怎样获取构造函数的名字
    怎样把实例对象当构造函数用
    怎样理解prototype对象的constructor属性
    怎样理解构造函数的原型对象prototype
    怎样给回调函数绑定this
    怎样绑定this
    怎样理解数组的空元素empty与undefined的区别
    怎样找出数组中的最大数值
    怎样调用对象的原生方法
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9426901.html
Copyright © 2011-2022 走看看