目录:
- 返回值的封装
- 分页
- 视图
- 路由
- 渲染器
一 返回值的封装
a. API的基本框架
setting:
1 首先注册rest_framework
2 版本配置
REST_FRAMEWORK = {
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
"VERSION_PARAM":"version",
"ALLOWED_VERSIONS":['v1','v2'],
"DEFAULT_VERSION":"v1",
}
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[v1|v2]+)/',include('api.urls')),
] # 路由分发
api路径:
from django.conf.urls import url,include
from django.contrib import admin
from api import views
urlpatterns = [
url(r'^index/$',views.IndexView.as_view()),
]
views:
from rest_framework import views
from rest_framework.response import Response
class IndexView(views.APIView):
def get(self,request,*args,**kwargs):
return Response('...')
b.返回值封装的方法:
# 配置、路径与上相同
views视图:


from rest_framework import views from rest_framework.response import Response from api import models from api.serializers.index import IndexSerializer class BaseResponse(object): def __init__(self,code=1000,data=None,error=None): self.code = code self.data = data self.error = error class IndexView(views.APIView): def get(self,request,*args,**kwargs): ret = BaseResponse() try: user_list = models.UserInfo.objects.all() ser = IndexSerializer(instance=user_list,many=True) ret.data = ser.data except Exception as e: ret.code = 1001 ret.error = 'xxx错误' return Response(ret.__dict__)


from rest_framework import views from rest_framework.response import Response from api import models from api.serializers.index import IndexSerializer class IndexView(views.APIView): def get(self,request,*args,**kwargs): ret = {'code': 1000,'data':None } try: user_list = models.UserInfo.objects.all() ser = IndexSerializer(instance=user_list,many=True) ret['data'] = ser.data except Exception as e: ret['code'] = 1001 ret['error'] = 'xxx错误' return Response(ret)
# 创建serlalizers文件 存放序列化类的py文件


from rest_framework import serializers class IndexSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField() pwd = serializers.CharField()
二 分页
分页最常见的三种情况:
1. 记录当前访问页的数据id
2. 最多显示120页
3. 对页码进行加密
a.基于limit offset做分页
自定义分页:
from rest_framework.pagination import LimitOffsetPagination
class P1(LimitOffsetPagination):
max_limit = 3
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
class IndexView(views.APIView):
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all()
p1 = P1()
page_user_list = p1.paginate_queryset(queryset=user_list, request=request, view=self)
ser = IndexSerializer(instance=page_user_list, many=True)
return Response(ser.data) # 不含上一页和下一页
# return p1.get_paginated_response(ser.data) # 含上一页和下一页
添加分页功能:


from rest_framework import views from rest_framework.response import Response from rest_framework.pagination import LimitOffsetPagination from api import models from api.serializers.index import IndexSerializer class BaseResponse(object): def __init__(self,code=1000,data=None,error=None): self.code = code self.data = data self.error = error class P1(LimitOffsetPagination): default_limit = 2 # 默认显示数据条数 limit_query_param = 'limit' offset_query_param = 'offset' max_limit = 3 # 限制最大显示条数 class IndexView(views.APIView): def get(self,request,*args,**kwargs): ret = BaseResponse() try: user_list = models.UserInfo.objects.all() p1 = P1() page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self) ser = IndexSerializer(instance=page_user_list,many=True) ret.data = ser.data ret.next = p1.get_next_link() except Exception as e: ret.code= 1001 ret.error = 'xxxx错误' return Response(ret.__dict__)
b.基于页码的分页
from rest_framework.pagination import PageNumberPagination
class P2(PageNumberPagination):
# 每页显示的数据条数
max_page_size = 5
page_size = 2
page_size_query_param = 'size'
# 页码
page_query_param = 'page'
c.基于Cursor的分页(解决大数据分页的问题:页码加密)
from rest_framework.pagination import CursorPagination
class P3(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'
ps:源码中不同的分页功能封装在不同的模块里,使用时可以根据需要将模块里的方法自定义,也可以配置在全局
三 视图
1. 基于APIView 自定义类
class IndexView(views.APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all()
ser = IndexSerializer(instance=user_list,many=True)
return Response(ser.data)
2. GenericAPIView(APIView)(过度作用)
3. GenericViewSet(ViewSetMixin, generics.GenericAPIView)
路由修改:
urlpatterns = [
url(r'^index/$', views.IndexView.as_view({'get':'list','post':'create'})),
url(r'^index/(?P\d+)$', views.IndexView.as_view({'get':'retrieve'})),
]
视图修改:
class IndexView(viewsets.GenericViewSet):
def list(self,request,*args,**kwargs):
pass # 获取列表信息
def retrieve(self, request, *args, **kwargs):
pass # 获取单条数据
def create(self,request, *args, **kwargs):
pass
4. ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)
自定义类:
class IndexView(ModelViewSet):
自定义:


增 POST /users/ 删 DELETE /users/1/ 改 PUT /users/1/ patch /users/1/ 查 GET /users/ # 全部数据 GET /users/1/ # 单条数据 urlpatterns = [ url(r'^index/$', views.IndexView.as_view()), url(r'^index/(?P\d+)$ ', views.IndexView.as_view()), ] class IndexView(views.APIView): def get(self,request,*args,**kwargs): pk = kwargs.get('pk') if pk: pass # 获取单条信息 else: pass # 获取列表信息 def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def patch(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass
ps:工作中最常用第1种(完全自定义)和第4种(封装最多,需要那种方法就引用那种模块),第3种不常用
四 路由
第一类:
# http://127.0.0.1:8000/api/v1/auth/
url(r'^auth/$', views.AuthView.as_view()),
# http://127.0.0.1:8000/api/v1/auth.json # 想要让页面显示json格式
url(r'^auth\.(?P[a-z0-9]+)$', views.AuthView.as_view()),
# http://127.0.0.1:8000/api/v1/auth/1/
url(r'^auth/(?P\d+)/$', views.AuthView.as_view()),
# http://127.0.0.1:8000/api/v1/auth/1.json
url(r'^auth/(?P\d+)\.(?P[a-z0-9]+)$', views.AuthView.as_view()),
class AuthView(views.APIView):
def get(self,request,*args,**kwargs):
return Response('...')
第二类:
url(r'^index/$', views.IndexView.as_view({'get':'list','post':'create'})),
url(r'^index/\.(?P[a-z0-9]+)$', views.IndexView.as_view({'get':'list','post':'create'})),
url(r'^index/(?P\d+)/$', views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
url(r'^index/(?P\d+)\.(?P[a-z0-9]+)$', views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
class IndexView(viewsets.ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = P2
第三类:(自动生成)
from rest_framework.routers import DefaultRouter
from rest_framework import views
router = DefaultRouter()
router.register('index',views.IndexViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
class IndexViewSet(viewsets.ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = P2
class IndexSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
五 渲染器
看到的页面是什么样子的,返回数据。
urls.py:
urlpatterns = [
url(r'^index/$', views.IndexView.as_view()),
url(r'^index\.(?P[a-z0-9]+)$', views.IndexView.as_view()),
]
views.py
class IndexView(views.APIView):
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
def get(self,request,*args,**kwargs):
self.dispatch
user_list = models.UserInfo.objects.all()
ser = IndexSerializer(instance=user_list,many=True)
return Response(ser.data)
ps:通过路径后缀来决定返回页面的格式,默认是JSONRenderer模块,返回json字符串,