DjangoのRESTフレームワークパーサーとレンダラ

パーザー

パーサの役割

サーバーの役割は、データを介してクライアントのパスを受けたパーサは、データは、それらが処理できるデータに解析されます。それは本質的に体を解析するデータ要求です。

パーサを見る前に、我々は最初のリクエストヘッダを受け入れ、ContentTypeを知っている必要があります。

受け入れ:私は解決することができるデータの種類お互いを伝えることです、あなたは私が欲しい種類のデータのものをしばしば示すことができます。

ContentTypeを:私はあなたを与えるだろうが、どのようなデータ型のお互いを伝えることです。

パーサーはContentTypeを要求は、データがI型かを判断するには、フロントに取得することです働き、その後、我々は、データを解析するために、適切なバックエンドパーサーを使用しています。

ジャンゴでのデータ解析

ビューでは、我々は、フロントエンドのデータがrequest.POSTによって送信された要求を取得することができ、その後、Djangoフレームワークは、それの要求本体にデータを取得する方法ですか?私たちは一緒に見て:

まず、requestオブジェクトは、その後、我々は以下のコードを見て、オブジェクトWSGIRequestクラスのインスタンスであります:

 

rest_framework.parsersからJSONParser、FormParser、MultiPartParser、FileUploadParserをインポート

 

 

 

 

 

 #Reset_framaworkデフォルトルート

 

 

django.contribの輸入管理者
 から django.urls インポートre_path、パスを
 から app01 インポートビュー
 から rest_frameworkの輸入  ルータ
 から django.conf.urlsのインポート、URLが含ま


ルータ = routers.DefaultRouter()
routers.register(作者、views.AuthorModelViewを)



urlpatterns = [ 
    re_path(R ' ^ ' 、(routers.urlsを含む))、

    #1 re_path(R '^管理/'、admin.site.urls)、 
    re_path(R '^公表する/ $'、views.PublishView.as_view()、名前は= "公開")、#ビュー:ビュー(リクエスト)===== APIView:ディスパッチ() 
    re_path(R '^が出版します/ / $」、views.PublishDetailView.as_view()、名前= "detailpublish")、#ビュー(P <PK> \ D +?):ビュー(リクエスト)===== APIView:ディスパッチ() #
    
     re_path(R '^ブック/ $'、views.BookView.as_view()、名前= "ブック")、 re_path(R '^冊/(\ dは+)/ $'、views.BookDetailView.as_view()、名前= "detailbook ")、 URL(R '^冊/(\ dは+)/ $'、ビュー:ビュー)、#ビュー(リクエスト)#のre_path(R '^作者/ $'、views.AuthorModelView.as_viewは、({" GET」 : "リスト"、 "ポスト": "作成"})、名前= "著者")、 
    
    

    
    re_path(R '^作者/(P <PK> \ D +)/ $?'、views.AuthorModelView.as_view({ "GET": "検索"、 "PUT": "更新"、 "削除": "破壊" })、名前= "detailauthor")、

    re_path(R ' ^ログイン/ $ '、views.LoginView.as_view()、名前= " ログイン" )、

]

 

 

 

 

 

 

 

この時点では、Djangoのビューにリコール要求されたデータが解析するため、ここではデータやrequest.FILES request.POSTで撮影した、とリクエストオブジェクトに割り当てることができます。

我々はまた、その問題を見つけ、DjangoはContenTypeをサポートしていないパーサはJSONデータ形式に解決することはできませんアプリケーション/ JSONであり、

 

DRFパーサ

我々request.dataから提出されたデータアクセス要求を取得するには、その後、request.dataデータはそれでDRFから来ることをすべて知っていますか?私たちは、ソースコードを見て:

 

 

 

 

 

 

無パーサ構成した場合、DRFは、デフォルトのパーサを使用します。

 

 

 

 

我々は、単一のビューまたはグローバルsettings.pyに使用するパーサを設定することができます。

rest_framework.response インポート対応

シングルビュー構成

class BookViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    parser_classes = [JSONParser, ]

全局配置

 

 

 

 

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}

注意:当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了,客户端如果使用浏览器提交,那么你将无法解析。

注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项

渲染器(rander)

渲染器同解析器相反,它定义了框架按照content_type来返回不同的响应。

DRF提供的渲染器有很多,默认是

 'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),

我们也可以在视图中局部设置也可以在全局的settings.py中进行设置:

局部设置

 

 

class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    renderer_classes = [JSONRenderer, ]

这样设置后就只能返回JSON格式的数据了,并不会像之前一样提供一个阅读友好的web页面。

全局设置

 

 

 

 

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
}

注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/Rivend/p/11871719.html