日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rest_framework-3

發布時間:2024/8/22 编程问答 31 如意码农
生活随笔 收集整理的這篇文章主要介紹了 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

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

總結

以上是生活随笔為你收集整理的Rest_framework-3的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。