27日目ページング例外処理インターフェイスドキュメント

27日目ページング例外処理インターフェイスドキュメント

1.ページネーション

RESTフレームワードはページングサポートを提供します

前に書く

ビューの継承は、次のような、ポケットベルが異なって書かれている、同じではありませんAPIViewし、GenericAPIView

GenericAPIView+ListModelMixinページングに関連するメソッドが含まれています最も簡単、設定する必要があるだけですが、ありAPIViewません。あなたが必要自分で書く

1.グローバル構成

構成ファイルでグローバルページング方法を設定できます

# views.py
class BookView(GenericViewSet, ListModelMixin):
    queryset = models.Book.objects.all()  # 源码中是默认添加一个all方法的,但是在使用分页器的时候不加就会报错
    serializer_class = serializer.BookSerializer
    
# settings.py
REST_FRAMEWORK = {
    
    
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 2,  # 每页数目  就这个有用
    'PAGE_QUERY_PARAM': 'p'  # 请求的参数没用,还是按照page来参考
}

画像-20201112173030873

注:ビューでページング機能をオフにする場合は、ビューで設定するだけです。

pagination_class = None

2.組み込みのポケットベル+書き換え

# urls.py 配置

router = SimpleRouter()
router.register('book', views.BookView)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('signup/', views.Sign_Up.as_view()),
]

urlpatterns += router.urls

2.1PageNumberPagination通常のページ付け(最もよく使用されます)

class BookView(GenericViewSet, ListModelMixin):
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer
    pagination_class = PageNumberPagination  # 这里分页器类是唯一的  也就是每个视图类只能有一种分页方式

しかし、これに伴う問題は、彼がされているpage_sizepage_size_query_parammax_page_sizeデフォルトはどれも他の言葉で、彼はすべてのコンテンツをプリントアウトして、デフォルトう

画像-20201112182205700

これが必要ない場合は、クラスの継承をオーバーライドできますPageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size = 3  # 每页显示多少条
    page_query_param = 'P'  # 页面查询参数
    page_size_query_param = 'size'  # 页面显示条数查询参数
    max_page_size = 5  # 页面最大显示条数
    
class BookView(GenericViewSet, ListModelMixin):
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer
    pagination_class = MyPageNumberPagination

指示127.0.0.1:8000/book/?page=2&size=3

したがって、これらのパラメータは便利です。max_page_size = 5 # 页面最大显示条数以下のリクエストに従うと、最初のページに5つが表示されるため、6番目と7番目のデータが表示されます。

画像-20201112182638512

2.2LimitOffsetPagination:オフセットページング

# views.py
class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = api_settings.PAGE_SIZE   # 默认返回查询的条数  这里我再setting中配置的是5
    limit_query_param = 'limit'              # 查询时,指定查询参数
    offset_query_param = 'offset'            # 查询时,指定的起始位置是哪
    max_limit = 4                         # 查询时,最多返回多少条数据
 class BookView(GenericViewSet, ListModelMixin):
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer
    pagination_class = MyLimitOffsetPagination   
    
# settings.py
REST_FRAMEWORK = {
    
    
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 5,  # 每页数目
}

;直接使用することもできますpagination_class = LimitOffsetPagination

指示127.0.0.1:8000/book/?limit=3&offset=1

ここで確認しに来ます

画像-20201112184607050

2.3 CursorPagination:カーソルのページ付け(速度ブロック)

これはできませんデフォルトで使用、継承する必要があります!

フロントエンドアクセスURLフォーム:

GET http://127.0.0.1/four/students/?cursor=cD0xNQ%3D%3D

サブクラスで定義できるプロパティ:

  • cursor_query_param:デフォルトのクエリフィールド。変更する必要はありません
  • page_size:各ページの数
  • 順序:どの順序に従って、指定する必要があります
# views.py
class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询的时候,指定的查询方式
    page_size = api_settings.PAGE_SIZE  # 每页显示多少条 五条
    ordering = 'id'  # 排序方式  这个一定要写
    page_size_query_param = 'size'  # 查询的时候指定每页显示多少条
    max_page_size = None  # 每页最多显示多少条
 
 class BookView(GenericViewSet, ListModelMixin):
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer
    pagination_class = MyCursorPagination   
    
# settings.py
REST_FRAMEWORK = {
    
    
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 5,  # 每页数目
}

画像-20201112190430283

注:3種類のポケットベルはすべて、前のページと次のページに戻ります。

3つのタイプのポケットベルには独自のシナリオがあります。3番目のタイプには制限がありますが、データをすばやく返すことができます。最初の2つのタイプの場所は指定できますが、一度に複数のデータを検索して、記憶。ストレス、そして3番目のものはしません。

3.APIViewページャーの書き方

 7 APIView的分页模式
	-新建一个类,继承普通分页,重写四个属性
    -视图类写法如下
	class StudentApiView(APIView):
        def get(self,request):
            student_list=Student.objects.all()
            page=MyPageNumberPagination()# 实例化得到对象
            # 只需要换不同的分页类即可
            res=page.paginate_queryset(student_list,request,self)# 开始分页
            ser=StudentSerializer(res,many=True)
            return page.get_paginated_response(ser.data) # 返回数据

2、グローバル例外

RESTフレームワークは例外処理を提供し、例外処理機能をカスタマイズできます。

ソースコードのビュー関数の例外が試行でキャッチされ、全体的な例外処理が実行されます

画像-20201112194352637

ここでは、関数を作成し、2つのパラメーターを渡してexception_handlerからインポートして実行し、結果を取得します。空のresponse場合responseは、コードに問題(異常)があることを意味します。この書き込みは実行されないため、構成して将来使用する必要があります

4.1使用方法

from rest_framework.views import exception_handler

def common_exception_handler(exc, context):
        response = exception_handler(exc, context)
        if response is None:
            # 无论是发生了什么错误,都返回 未知错误,当然也可以进一步判断
            response = Response({
    
    'code':999,'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        return response

構成ファイルでカスタム例外処理を宣言します

在setting中配置
    	REST_FRAMEWORK = {
    
    
    		'EXCEPTION_HANDLER':'app01.utils.common_exception_handler'
		}

宣言されていない場合、次のようにデフォルトのメソッドが使用されます

rest_frame / settings.py

REST_FRAMEWORK = {
    
    
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

4.2ケース

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError

def common_exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        print('[%s]: %s' % (view, exc))
        if isinstance(exc, DatabaseError):
            response = Response({
    
    'detail': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
        else:
            response = Response({
    
    'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response

3、カスタム応答

以前responseにオブジェクトをカプセル化しましたが、DRFを継承しなかったのResponseは、辞書を使用することだけです。

ここでは、Responseクラスを書き換え、親クラスを継承して__init__から書き換えてから、必要なパラメーターを渡します。

class APIResponse(Response):
    def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, content_type=None,
                 **kwargs):  # 用我自己的response,可以不传默认用弗雷德,如果我们要使用就要做出改变
        dic = {
    
    'code': code, 'msg': msg}  # 这是返回信息格式
        if data:  # 如果有信息
            dic['data'] = data  # 添加进去
        
        dic.update(kwargs)  # 这里使用往里面添加kwargs对应的字典
        super().__init__(data=dic, status=status,
                         template_name=None, headers=headers,
                         exception=False, content_type=content_type)

使用する

# serializer.py
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'
        
        
# views.py
class TextAPI(GenericAPIView):
    queryset = models.Book.objects
    serializer_class = serializer.BookSerializer
    
    def get(self, request, *args, **kwargs):
        book = self.get_object()
        ser = self.get_serializer(book)
        return utils.APIResponse(data=ser.data)
    
# urls.py
url(r'^text/(?P<pk>\d+)', views.TextAPI.as_view())

次に実行します

画像-20201112220459571

4、インターフェイスドキュメントを自動的に生成します

1 借助于第三方:coreapi,swagger
2 在路由中
    from rest_framework.documentation import include_docs_urls
    path('docs/', include_docs_urls(title='图书管理系统api'))
3 在配置文件中
	REST_FRAMEWORK = {
    
    
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
	}
4 写视图类(需要加注释)
    class BookListCreateView(ListCreateAPIView):
        """
        get:
        返回所有图书信息.
        asdfasfda

        post:
        新建图书.
        """
        queryset = Student.objects.all()
        serializer_class = StudentSerializer
5 只需要在浏览器输入,就可以看到自动生成的接口文档()
	http://127.0.0.1:8000/docs/

展開

歩哨ログ管理

おすすめ

転載: blog.csdn.net/A1L__/article/details/109660487