zoukankan      html  css  js  c++  java
  • RestFramework

    rest-framework框架的基本组件

    	</h1>
    	<div class="clear"></div>
    	<div class="postBody">
    

    快速实例

    Quickstart

    序列化

    创建一个序列化类

    简单使用

    开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

    models部分:

    复制代码
    from django.db import models
    

    # Create your models here.

    class Book(models.Model):
    title
    =models.CharField(max_length=32)
    price
    =models.IntegerField()
    pub_date
    =models.DateField()
    publish
    =models.ForeignKey("Publish")
    authors
    =models.ManyToManyField("Author")
    def str(self):
    return self.title

    class Publish(models.Model):
    name
    =models.CharField(max_length=32)
    email
    =models.EmailField()
    def str(self):
    return self.name

    class Author(models.Model):
    name
    =models.CharField(max_length=32)
    age
    =models.IntegerField()
    def str(self):
    return self.name

    复制代码

    views部分:

    复制代码
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import *
    from django.shortcuts import HttpResponse
    from django.core import serializers
    

    from rest_framework import serializers

    class BookSerializers(serializers.Serializer):
    title
    =serializers.CharField(max_length=32)
    price
    =serializers.IntegerField()
    pub_date
    =serializers.DateField()
    publish
    =serializers.CharField(source="publish.name")
    #authors=serializers.CharField(source="authors.all")
    authors=serializers.SerializerMethodField()
    def get_authors(self,obj):
    temp
    =[]
    for author in obj.authors.all():
    temp.append(author.name)
    return temp

    class BookViewSet(APIView):

    </span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
        book_list</span>=<span style="color: #000000;">Book.objects.all()
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式1:</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> from django.forms.models import model_to_dict</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> import json</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> data=[]</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> for obj in book_list:</span>
        <span style="color: #008000;">#</span><span style="color: #008000;">     data.append(model_to_dict(obj))</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> print(data)</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse("ok")</span>
    
        <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式2:</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> data=serializers.serialize("json",book_list)</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse(data)</span>
    
        <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式3:</span>
        bs=BookSerializers(book_list,many=<span style="color: #000000;">True)
        </span><span style="color: #0000ff;">return</span> Response(bs.data)</pre>
    
    复制代码

    ModelSerializer

    class BookSerializers(serializers.ModelSerializer):
          class Meta:
              model=Book
              fields="__all__"
              depth=1

    提交post请求

    复制代码
      def post(self,request,*args,**kwargs):
    
        bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>
    

    bs.save()
    return Response(bs.data)
    else:
    return HttpResponse(bs.errors)

    复制代码

    重写save中的create方法

    复制代码
    class BookSerializers(serializers.ModelSerializer):
    
      </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
          model</span>=<span style="color: #000000;">Book
          fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span>
          <span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ['authors',]</span>
          <span style="color: #008000;">#</span><span style="color: #008000;"> depth=1</span>
    
      <span style="color: #0000ff;">def</span><span style="color: #000000;"> create(self, validated_data):
        
          authors </span>= validated_data.pop(<span style="color: #800000;">'</span><span style="color: #800000;">authors</span><span style="color: #800000;">'</span><span style="color: #000000;">)
          obj </span>= Book.objects.create(**<span style="color: #000000;">validated_data)
          obj.authors.add(</span>*<span style="color: #000000;">authors)
          </span><span style="color: #0000ff;">return</span> obj</pre>
    
    复制代码

     单条数据的get和put请求

    复制代码
    class BookDetailViewSet(APIView):
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):
        book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=<span style="color: #000000;">BookSerializers(book_obj)
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
        book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=BookSerializers(book_obj,data=<span style="color: #000000;">request.data)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            bs.save()
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
            </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
    
    复制代码

    超链接API:Hyperlinked

    复制代码
    class BookSerializers(serializers.ModelSerializer):
          publish= serializers.HyperlinkedIdentityField(
    view_name='publish_detail',
    lookup_field="publish_id",
    lookup_url_kwarg="pk") class Meta: model=Book fields="__all__" #depth=1
    复制代码

    urls部分:

    1
    2
    3
    4
    5
    6
    urlpatterns = [
        url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),
        url(r'^books/(?P<pk>d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),
        url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),
        url(r'^publishers/(?P<pk>d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
    ]

    视图三部曲

    使用混合(mixins)

    上一节的视图部分:

    复制代码
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import *
    from django.shortcuts import HttpResponse
    from django.core import serializers
    

    from rest_framework import serializers

    class BookSerializers(serializers.ModelSerializer):
    class Meta:
    model
    =Book
    fields
    ="all"
    #depth=1

    class PublshSerializers(serializers.ModelSerializer):

      </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
          model</span>=<span style="color: #000000;">Publish
          fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span><span style="color: #000000;">
          depth</span>=1
    

    class BookViewSet(APIView):

    </span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
        book_list</span>=<span style="color: #000000;">Book.objects.all()
        bs</span>=BookSerializers(book_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    
    
    </span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(request.data)
        bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(bs.validated_data)
            bs.save()
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)
    

    class BookDetailViewSet(APIView):

    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):
        book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=BookSerializers(book_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
        book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=BookSerializers(book_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            bs.save()
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)
    

    class PublishViewSet(APIView):

    </span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
        publish_list</span>=<span style="color: #000000;">Publish.objects.all()
        bs</span>=PublshSerializers(publish_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    
    
    </span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs):
    
        bs</span>=PublshSerializers(data=request.data,many=<span style="color: #000000;">False)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>
    

    bs.save()
    return Response(bs.data)
    else:
    return HttpResponse(bs.errors)

    class PublishDetailViewSet(APIView):

    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):
    
        publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=PublshSerializers(publish_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
        publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first()
        bs</span>=PublshSerializers(publish_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
            bs.save()
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
            </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
    
    复制代码

    mixin类编写视图

    复制代码
    from rest_framework import mixins
    from rest_framework import generics
    

    class BookViewSet(mixins.ListModelMixin,
    mixins.CreateModelMixin,
    generics.GenericAPIView):

    queryset </span>=<span style="color: #000000;"> Book.objects.all()
    serializer_class </span>=<span style="color: #000000;"> BookSerializers
    
    </span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">return</span> self.list(request, *args, **<span style="color: #000000;">kwargs)
    
    </span><span style="color: #0000ff;">def</span> post(self, request, *args, **<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">return</span> self.create(request, *args, **<span style="color: #000000;">kwargs)
    

    class BookDetailViewSet(mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    generics.GenericAPIView):
    queryset
    = Book.objects.all()
    serializer_class
    = BookSerializers

    </span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">return</span> self.retrieve(request, *args, **<span style="color: #000000;">kwargs)
    
    </span><span style="color: #0000ff;">def</span> put(self, request, *args, **<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">return</span> self.update(request, *args, **<span style="color: #000000;">kwargs)
    
    </span><span style="color: #0000ff;">def</span> delete(self, request, *args, **<span style="color: #000000;">kwargs):
        </span><span style="color: #0000ff;">return</span> self.destroy(request, *args, **kwargs)</pre>
    
    复制代码

    使用通用的基于类的视图

    通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

    复制代码
    from rest_framework import mixins
    from rest_framework import generics
    

    class BookViewSet(generics.ListCreateAPIView):

    queryset </span>=<span style="color: #000000;"> Book.objects.all()
    serializer_class </span>=<span style="color: #000000;"> BookSerializers
    

    class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
    queryset
    = Book.objects.all()
    serializer_class
    = BookSerializers

    class PublishViewSet(generics.ListCreateAPIView):

    queryset </span>=<span style="color: #000000;"> Publish.objects.all()
    serializer_class </span>=<span style="color: #000000;"> PublshSerializers
    

    class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
    queryset
    = Publish.objects.all()
    serializer_class
    = PublshSerializers

    复制代码

    viewsets.ModelViewSet

    urls.py:

    复制代码
        url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),
        url(r'^books/(?P<pk>d+)$', views.BookViewSet.as_view({
                    'get': 'retrieve',
                    'put': 'update',
                    'patch': 'partial_update',
                    'delete': 'destroy'
                }),name="book_detail"),
    复制代码

    views.py:

    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializers

    认证与权限组件

    认证组件

    局部视图认证

    在app01.service.auth.py:

    复制代码
    class Authentication(BaseAuthentication):
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> authenticate(self,request):
        token</span>=request._request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">token</span><span style="color: #800000;">"</span><span style="color: #000000;">)
        token_obj</span>=UserToken.objects.filter(token=<span style="color: #000000;">token).first()
        </span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> token_obj:
            </span><span style="color: #0000ff;">raise</span> exceptions.AuthenticationFailed(<span style="color: #800000;">"</span><span style="color: #800000;">验证失败!</span><span style="color: #800000;">"</span><span style="color: #000000;">)
        </span><span style="color: #0000ff;">return</span> (token_obj.user,token_obj)</pre>
    
    复制代码

    在views.py:

    复制代码
    def get_random_str(user):
        import hashlib,time
        ctime=str(time.time())
    
    md5</span>=hashlib.md5(bytes(user,encoding=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">))
    md5.update(bytes(ctime,encoding</span>=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">))
    
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> md5.hexdigest()
    

    from app01.service.auth import *

    from django.http import JsonResponse
    class LoginViewSet(APIView):
    authentication_classes
    = [Authentication,]
    def post(self,request,*args,**kwargs):
    res
    ={"code":1000,"msg":None}
    try:
    user
    =request._request.POST.get("user")
    pwd
    =request._request.POST.get("pwd")
    user_obj
    =UserInfo.objects.filter(user=user,pwd=pwd).first()
    print(user,pwd,user_obj)
    if not user_obj:
    res[
    "code"]=1001
    res[
    "msg"]="用户名或者密码错误"
    else:
    token
    =get_random_str(user)
    UserToken.objects.update_or_create(user
    =user_obj,defaults={"token":token})
    res[
    "token"]=token

        </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e:
            res[</span><span style="color: #800000;">"</span><span style="color: #800000;">code</span><span style="color: #800000;">"</span>]=1002<span style="color: #000000;">
            res[</span><span style="color: #800000;">"</span><span style="color: #800000;">msg</span><span style="color: #800000;">"</span>]=<span style="color: #000000;">e
    
        </span><span style="color: #0000ff;">return</span> JsonResponse(res,json_dumps_params={<span style="color: #800000;">"</span><span style="color: #800000;">ensure_ascii</span><span style="color: #800000;">"</span>:False})</pre>
    
    复制代码

    全局视图认证组件

    settings.py配置如下:

    1
    2
    3
    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
    }

    权限组件

    局部视图权限

    在app01.service.permissions.py中:

    复制代码
    from rest_framework.permissions import BasePermission
    class SVIPPermission(BasePermission):
        message="SVIP才能访问!"
        def has_permission(self, request, view):
            if request.user.user_type==3:
                return True
            return False
    复制代码

    在views.py:

    from app01.service.permissions import *
    

    class BookViewSet(generics.ListCreateAPIView):
    permission_classes
    = [SVIPPermission,]
    queryset
    = Book.objects.all()
    serializer_class
    = BookSerializers

    全局视图权限

    settings.py配置如下:

    1
    2
    3
    4
    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
    }

    throttle(访问频率)组件

    局部视图throttle

    在app01.service.throttles.py中:

    复制代码
    from rest_framework.throttling import BaseThrottle
    

    VISIT_RECORD={}
    class VisitThrottle(BaseThrottle):

    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span><span style="color: #000000;">(self):
        self.history</span>=<span style="color: #000000;">None
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> allow_request(self,request,view):
        remote_addr </span>= request.META.get(<span style="color: #800000;">'</span><span style="color: #800000;">REMOTE_ADDR</span><span style="color: #800000;">'</span><span style="color: #000000;">)
        </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(remote_addr)
        </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time
        ctime</span>=<span style="color: #000000;">time.time()
    
        </span><span style="color: #0000ff;">if</span> remote_addr <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> VISIT_RECORD:
            VISIT_RECORD[remote_addr]</span>=<span style="color: #000000;">[ctime,]
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
    
        history</span>=<span style="color: #000000;">VISIT_RECORD.get(remote_addr)
        self.history</span>=<span style="color: #000000;">history
    
        </span><span style="color: #0000ff;">while</span> history <span style="color: #0000ff;">and</span> history[-1]&lt;ctime-60<span style="color: #000000;">:
            history.pop()
    
        </span><span style="color: #0000ff;">if</span> len(history)&lt;3<span style="color: #000000;">:
            history.insert(0,ctime)
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> False
    
    </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> wait(self):
        </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time
        ctime</span>=<span style="color: #000000;">time.time()
        </span><span style="color: #0000ff;">return</span> 60-(ctime-self.history[-1])</pre>
    
    复制代码

    在views.py中:

    from app01.service.throttles import *
    

    class BookViewSet(generics.ListCreateAPIView):
    throttle_classes
    = [VisitThrottle,]
    queryset
    = Book.objects.all()
    serializer_class
    = BookSerializers

    全局视图throttle

    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
        "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
    }

    内置throttle类

    在app01.service.throttles.py修改为:

    class VisitThrottle(SimpleRateThrottle):
    
    scope</span>=<span style="color: #800000;">"</span><span style="color: #800000;">visit_rate</span><span style="color: #800000;">"</span>
    <span style="color: #0000ff;">def</span><span style="color: #000000;"> get_cache_key(self, request, view):
    
        </span><span style="color: #0000ff;">return</span> self.get_ident(request)</pre>
    

    settings.py设置:

    复制代码
    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
        "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
        "DEFAULT_THROTTLE_RATES":{
            "visit_rate":"5/m",
        }
    }
    复制代码

    解析器

    request类

    django的request类和rest-framework的request类的源码解析

    局部视图

    复制代码
    from rest_framework.parsers import JSONParser,FormParser
    class PublishViewSet(generics.ListCreateAPIView):
        parser_classes = [FormParser,JSONParser]
        queryset = Publish.objects.all()
        serializer_class = PublshSerializers
        def post(self, request, *args, **kwargs):
            print("request.data",request.data)
            return self.create(request, *args, **kwargs)
    复制代码

    全局视图

    复制代码
    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
        "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
        "DEFAULT_THROTTLE_RATES":{
            "visit_rate":"5/m",
        },
        "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
    }
    复制代码

    分页

    简单分页

    复制代码
    from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
    

    class PNPagination(PageNumberPagination):
    page_size
    = 1
    page_query_param
    = 'page'
    page_size_query_param
    = "size"
    max_page_size
    = 5

    class BookViewSet(viewsets.ModelViewSet):

    queryset </span>=<span style="color: #000000;"> Book.objects.all()
    serializer_class </span>=<span style="color: #000000;"> BookSerializers
    </span><span style="color: #0000ff;">def</span> list(self,request,*args,**<span style="color: #000000;">kwargs):
    
        book_list</span>=<span style="color: #000000;">Book.objects.all()
        pp</span>=<span style="color: #000000;">LimitOffsetPagination()
        pager_books</span>=pp.paginate_queryset(queryset=book_list,request=request,view=<span style="color: #000000;">self)
        </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(pager_books)
        bs</span>=BookSerializers(pager_books,many=<span style="color: #000000;">True)
    
        </span><span style="color: #008000;">#</span><span style="color: #008000;">return Response(bs.data)</span>
        <span style="color: #0000ff;">return</span> pp.get_paginated_response(bs.data)</pre>
    
    复制代码

    偏移分页

    from rest_framework.pagination import LimitOffsetPagination

      

     

  • 相关阅读:
    MVC分部视图@Html.Partial
    MVC分部视图@Html.Partial
    DevExpress ASP.NET
    DevExpress ASP.NET
    @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
    @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
    MVC中@Html.Action的用法(类似自定义控件)
    MVC中@Html.Action的用法(类似自定义控件)
    C#.Net下的防抖Debounce和节流阀Throttle功能实现
    C#.Net下的防抖Debounce和节流阀Throttle功能实现
  • 原文地址:https://www.cnblogs.com/maaosheng/p/11631656.html
Copyright © 2011-2022 走看看