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 modelsclass 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,includefrom django.contrib import adminurlpatterns = [ url(r'^admin/', admin.site.urls), url('api/', include('api.urls')),]
api/urls.py
from django.conf.urls import urlfrom api.views import UserViewurlpatterns = [ url(r'users/', UserView.as_view()),]
api/views.py(QueryParameterVersioning用于去GET参数中取version)
from django.shortcuts import render,HttpResponsefrom rest_framework.views import APIViewfrom rest_framework.versioning import QueryParameterVersioningclass 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 urlfrom api.views import UserViewurlpatterns = [ url(r'(?P\w+)/users/', UserView.as_view()),]
注释掉我们在views.py下之前的实例化
from django.shortcuts import render,HttpResponsefrom rest_framework.views import APIViewclass 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 urlfrom api.views import courseurlpatterns = [ 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 modelsfrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework.pagination import PageNumberPaginationfrom api.utils.response import BaseResponsefrom 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,includefrom django.contrib import adminurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/(?P\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: