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来参考
}
注:ビューでページング機能をオフにする場合は、ビューで設定するだけです。
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_size
、page_size_query_param
、max_page_size
デフォルトはどれも他の言葉で、彼はすべてのコンテンツをプリントアウトして、デフォルトう
これが必要ない場合は、クラスの継承をオーバーライドできます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番目のデータが表示されます。
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
ここで確認しに来ます
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, # 每页数目
}
注: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フレームワークは例外処理を提供し、例外処理機能をカスタマイズできます。
ソースコードのビュー関数の例外が試行でキャッチされ、全体的な例外処理が実行されます
ここでは、関数を作成し、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())
次に実行します
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/
展開
歩哨ログ管理