パーザー
パーサの役割
サーバーの役割は、データを介してクライアントのパスを受けたパーサは、データは、それらが処理できるデータに解析されます。それは本質的に体を解析するデータ要求です。
パーサを見る前に、我々は最初のリクエストヘッダを受け入れ、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', ), }
注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。