URLコントローラ、パーサ、応答では、ソーター

URLコントロール

最初の(主に)書きます

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^books/$',views.BookView.as_view()),
    url(r'^book/(?P<pk>\d+)$/',views.Bookdetail.as_view())

]

(ViewSetMixinを継承している限り)第2の書き込み

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^publish/$',views.PublishView.as_view({'get':'list','post':'create'})),
    url(r'^publish/(?P<pk>\d+)/',views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))  # 这里必须用pk,被封死了
]

JSON形式のルーティング(すなわち、ページpublish.jsonが戻らないアクセスすることではなく、文字列のJSON形式)を返します。

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^publish\.(?P<format>\w+)$',views.PublishView.as_view({'get':'list','post':'create'})),
]

第三に書き込み(自動的に生成されたルートがModelViewSetを継承する必要があります)

SimpleRouter:自動的に生成された二つの経路

http://127.0.0.1:8000/publish/
http://127.0.0.1:8000/publish/3
from django.conf.urls import url,include
from app01 import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('publish',views.PublishView)
urlpatterns = [
    url(r'',include(router.urls)),
]

defaultrouterに:4自動的に生成されたルーティング

http://127.0.0.1:8000/publish/3
http://127.0.0.1:8000/publish.json
http://127.0.0.1:8000/publish/3
http://127.0.0.1:8000/publish/3.json   
from django.conf.urls import url,include
from app01 import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('publish',views.PublishView)
urlpatterns = [
    url(r'',include(router.urls)),
]

パーザー

一般的に移動する必要はありません、ほとんどのプロジェクトは、その上にグローバルコンフィギュレーションのクリックを開始します

私の役割は、解析できるフォーマットの種類上を通過クラスの前を制御することです

グローバル使用

構成設定で:

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES':[
        'rest_framework.parsers.JSONParser',
      'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ]
}

話題

のみ最初のリクエストボディ処理要求コンテンツタイプアプリケーション/ JSON

from rest_framework.parsers import JSONParser
class TestView(APIView):
    parser_classes = [JSONParser,]

リクエストボディアプリケーション/ x-www-form-urlencodedでのみコンテンツタイプヘッダ処理要求であります

from rest_framework.parsers import FormParser
class TestView(APIView):
    parser_classes = [FormParser,]

ボディコンテンツタイプヘッダ処理要求のマルチパート/フォームデータのみ要求

from rest_framework.parsers import MultiPartParser
class TestView(APIView):
    parser_classes = [MultiPartParser, ]

ファイルのみをアップロード

from rest_framework.parsers import FileUploadParser
class TestView(APIView):
    parser_classes = [FileUploadParser, ]

ソースコード解析

# 1.在调用request.data时,才进行解析,由此入手
@property
def data(self):
    if not _hasattr(self, '_full_data'):
        self._load_data_and_files()
        return self._full_data
    
# 2.查看self._load_data_and_files()方法--->self._data, self._files = self._parse()
def _parse(self):
    #用户请求头里content_type的值
    media_type = self.content_type
    
    #self.parsers 就是用户配置的parser_classes = [FileUploadParser,FormParser ]
    #self里就有content_type,传入此函数
    parser = self.negotiator.select_parser(self, self.parsers)
    
# 3.查看self.negotiator.select_parser(self,self.parsers)
def select_parser(self, request, parsers):
    # 通过media_type和request.content_type比较,来返回解析器,然后调用解析器的解析方法
    # 每个解析器都有media_type = 'multipart/form-data'属性
    for parser in parsers:
        if media_type_matches(parser.media_type, request.content_type):
          return parser
    return None

# 4.最终调用parser的解析方法来解析parsed = parser.parse(stream, media_type, self.parser_context)

レスポンダ

移動しないでください、あなたは、グローバルコンフィギュレーションを使用することができます

グローバル使用

'DEFAULT_RENDERER_CLASSES':[xxx,xxx]

話題

ビュークラスの設定は、のみJSONRendererを書く場合は、ページのJSON形式に戻ります

renderer_classes = [JSONRenderer, BrowsableAPIRenderer] 

バージョン管理

バージョン管理のための

グローバル使用

 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
    'VERSION_PARAM': 'version',  # URL中获取值的key
    'PAGE_SIZE':2   #表示每页显示两条

ルーティング

url(r'^(?P<version>[v1|v2]+)/test/', views.Test.as_view())

コードの対応するバージョンは、対応を実行するバージョンビュークラスrequest.versionに現在アクセスすることによって除去することができます

話題

from rest_framework.versioning import URLPathVersioning
class TestView(APIView):
    versioning_class = URLPathVersioning
     def get(self, request, *args, **kwargs):
        # 获取版本
        print(request.version)
        # 获取版本管理的类
        print(request.versioning_scheme)

        # 反向生成URL
        reverse_url = request.versioning_scheme.reverse('test', request=request)
        print(reverse_url)

        return Response('GET请求,响应内容')

ページング

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

1.一般的なページング

基本的な使用:

ページ= PageNumberPaginationがインスタンス化されたオブジェクトを生成し、

戻り値= page.paginate_queryset(RET、リクエスト、自己)

シーケンスは、その後の値を返します。

四つのパラメータ:

どのように多くのページあたり:page.page_size = 3

page.page_query_param =「XXX」:クエリは、クエリのキー値のページを指定します

page.page_size_query_parem =「サイズ」:ディスプレイ9を示す= 9、このようなサイズを表示どのように多くのキー値クエリフロント制御、

ページごとの最大表示制御とは何か、サイズ100、渡された場合、また10まで示した:page.max_page_size = 10

class PublishView(APIView):
    def get(self,request,*args,**kwargs):
        #批量添加
        # ll=[]
        # for i in range(100):
        #     ll.append(models.Publish(name='%s出版社'%i,city='%s城市'%i))
        #
        # models.Publish.objects.bulk_create(ll)
        #第一种方法,普通分页
        #查询出所有数据
        ret=models.Publish.objects.all()
        #实例化产生一个普通分页对象
        page=PageNumberPagination()
        #每页显示多少条
        page.page_size=3
        #查询指定查询哪一页的key值,例路径后面加?page=3,就是查询第三页
        page.page_query_param='page'

        #前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
        page.page_size_query_param='size'
        #控制每页最大显示多少,size如果传100,最多也是显示10
        page.max_page_size=10
        ret_page=page.paginate_queryset(ret,request,self)
        #序列化
        pub_ser=serializer.PublishSerializers(ret_page,many=True)
        #去setting中配置每页显示多少条,'PAGE_SIZE':2

        return Response(pub_ser.data)

2.ページングオフセット

基本的な使用:

ページ= LimitOffsetPaginationがインスタンス化されたオブジェクトを生成し、

戻り値= page.paginate_queryset(RET、リクエスト、自己)

シーケンスのそしてシリアライズされ、戻り値

四つのパラメータ:

次のいくつかのデフォルトは3を取るベンチマーク場所から撮影、指定することができます。page.default_limit = 3

たびに作られた作品の数:page.limit_query_param =「リミット」

page.offset_query_paramは=「オフセット」:現在の位置、次の撮影を指示部6において、= 6オフセットが今、位置に移動するベンチマーク値、

最大テイク10:page.max_limit = 10

    def get(self, request, *args, **kwargs):
        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = LimitOffsetPagination()
        #四个参数:
        #从标杆位置往后取几个,默认取3个,我可以指定
        page.default_limit=3
        #每次取得条数
        page.limit_query_param='limit'
        #标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
        page.offset_query_param='offset'
        #最大取10条
        page.max_limit=10

        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
        # 去setting中配置每页显示多少条
        return page.get_paginated_response(pub_ser.data)
        # return Response(pub_ser.data)

注:get_paginated_response(pub_ser.data):データの総数は、このメソッドが戻ると、以前のアドレス、次のページのアドレスを呼び出します

3.cursorカーソルモード

基本的な使用:

ページ= CursorPaginationがインスタンス化されたオブジェクトを生成し、

戻り値= page.paginate_queryset(RET、リクエスト、自己):、すべてのデータがページングされるRET

シーケンスのそしてシリアライズされ、戻り値

三つのパラメータ:

各ページのサイズが表示されます。page.page_size = 3

キー値のクエリ:page.cursor_query_param =「カーソル」

なに並べ替え:page.ordering = 'ID'

    def get(self, request, *args, **kwargs):
        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = CursorPagination()
        #三个参数:
        #每页显示的大小
        page.page_size=3
        #查询的key值
        page.cursor_query_param='cursor'
        # 按什么排序
        page.ordering='id'

        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
       
        return page.get_paginated_response(pub_ser.data)
        

理解します

ソースを読む:いない場合は、そこに反射、任意の直接の復帰時値、最初に見てみる前に、実行のこの価値のある方法を取りに行きます

おすすめ

転載: www.cnblogs.com/yanminggang/p/11140533.html