Rest_framework-3

目录:


 一 返回值的封装

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<version>[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()
index

 二 分页

分页最常见的三种情况:

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<pk>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<pk>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
     
View Code

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<format>[a-z0-9]+)$', views.AuthView.as_view()),

# http://127.0.0.1:8000/api/v1/auth/1/
url(r'^auth/(?P<pk>d+)/$', views.AuthView.as_view()),

# http://127.0.0.1:8000/api/v1/auth/1.json
url(r'^auth/(?P<pk>d+).(?P<format>[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<format>[a-z0-9]+)$', views.IndexView.as_view({'get':'list','post':'create'})),

url(r'^index/(?P<pk>d+)/$', views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),

url(r'^index/(?P<pk>d+).(?P<format>[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<format>[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字符串,                                                                                                    

原文地址:https://www.cnblogs.com/lianxuebin/p/8433459.html