• 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字符串,                                                                                                    

  • 相关阅读:
    Dp~Hrbust1426( 集训队的晚餐 )
    DP~数塔(hrbustoj1004)
    MyEclipse启动性能优化(----加快启动速度)
    很实用的php的缓存类文件示例
    PHP中9大缓存技术总结
    微信公众平台开发(76) 获取用户基本信息
    js中 onreadystatechange 和 onload的区别
    一个js文件导入js的函数
    PHP cURL实现模拟登录与采集使用方法详解教程
    Mysql清空表(truncate)与删除表中数据(delete)的区别
  • 原文地址:https://www.cnblogs.com/lianxuebin/p/8433459.html
Copyright © 2020-2023  润新知