パーサアクション:
対応する選択に応じて、リクエストボディコンテンツ要求コンテンツタイプヘッダパーサを処理します。
そこアプリケーション/ JSON、x-www-form-urlencodedで、フォームデータ形式
URLエンコード:フォーマット本体部材である:名前=&LQZ年齢= 18である&妻= liuyifei
いるFormData:区別が形成され、本体部分とデータ部分のファイル形式
JSON形式:本体にJSON形式で体であります
二つの世界的な使用のパーサー:
settings.pyで
REST_FRAMEWORK = { ' DEFAULT_PARSER_CLASSES ' :[ ' rest_framework.parsers.JSONParser '
' rest_framework.parsers.FormParser '
' rest_framework.parsers.MultiPartParser ' ] }
ビュー層:
rest_framework.views インポートAPIView から rest_framework.response インポートレスポンス クラスTestViewに(APIView): DEF POST(自己、要求、* argsを、** :kwargsから) 印刷(request.content_type) #JSONParser値取得要求と対応を使用して処理 プリント(request.data) #のファイルアプリケーション/時間x-www-form-urlencodedで又はマルチパート/フォームデータ、request.POSTは、の値有する プリント(request.POSTの) プリント(request.FILES) を返す(レスポンス' POSTを要求、応答内容" ) DEFPUT(セルフ、要求、* argsを、** kwargsから): 返すレスポンス(' PUT要求、応答内容を')
パーサに三つの部分を使用します。
のみ最初のリクエストボディ処理要求コンテンツタイプアプリケーション/ JSON
rest_framework.views インポートAPIView から rest_framework.response インポートレスポンス から rest_framework.request のインポート要求 から rest_framework.parsers インポートJSONParserの クラス:TestViewに(APIView) parser_classes = [JSONParser、] DEF POST(自己、要求、* argsを、** kwargsから) : 印刷(request.content_type) #は、要求された値を取得し、対応する処理JSONParserを使用して 印刷(request.data)を #ときに、アプリケーション/ X-WWW-フォーム- URLエンコード又はマルチパート/フォームデータ、request.POSTのみに値 印刷(request.POSTの) 印刷(request.FILES) を返す応答(' POST要求、応答内容を' ) DEF(セルフ、要求、* argsを、** PUT kwargsからの): 返すレスポンス(' PUT要求、応答内容を')
アプリケーションの要求ヘッダ要求ボディコンテンツタイプ/のx-www-form-urlencodedで
rest_framework.viewsの輸入APIView から rest_framework.responseのインポート応答 から rest_framework.request インポート要求 から rest_framework.parsers インポートFormParserの クラスTestViewに(APIViewを):
parser_classes = [FormParser、]
デフポスト(自己、要求、* argsを、** kwargsから) : プリント(request.content_type)
リクエストボディのマルチパート/フォームデータのリクエストヘッダのコンテンツタイプ
rest_framework.viewsの輸入APIView から rest_framework.responseのインポート応答 から rest_framework.request インポート要求 から rest_framework.parsers インポートMultiPartParserの クラスTestViewに(APIViewを): parser_classes = [MultiPartParser、] デフポスト(自己、要求、* argsを、** kwargsから) : プリント(request.content_type)
ファイルのアップロード:
rest_framework.viewsのインポートAPIView から rest_framework.responseのインポート応答 から rest_framework.request インポート要求 から rest_framework.parsers インポートFileUploadParserの クラスTestViewに(APIViewを):
parser_classes = [FileUploadParser、】
同時により多くのパーサで
複数のパーサーを使用する場合、要求に応じて残りのフレームワークは、自動Content-Typeヘッダと比較し、対応するパーサーを使用しています
rest_framework.viewsのインポートAPIView から rest_framework.responseのインポート応答 から rest_framework.request インポート要求 から rest_framework.parsers インポートJSONParser、FormParser、MultiPartParserの クラス:TestViewに(APIView)
parser_classes = [JSONParser、FormParser、MultiPartParser、]
DEFポスト(自己、リクエストを、* argsを、** kwargsから): プリント(request.content_type)
4つのソースコード解析:
1 このように開始する、解析する前に、request.dataを呼び出す @Property DEFにデータ(自己): IF ない _hasattr(セルフ、' _full_data ' ): self._load_data_and_files() の戻りself._full_dataを 2ビューself._load_data_and_filesは()方法----> self._data、self._files = self._parse() DEF _parse(自己): #CONTENT_TYPEの予めユーザによって要求された値 MEDIA_TYPE = self.content_type #self.parsersは、ユーザが設定parser_classesが=ある[FileUploadParser 、FormParser] #のがCONTENT_TYPEにおける自己、この関数に渡された パーサ=self.negotiator.select_parser(自己、self.parsers) 3 ビューself.negotiator.select_parser(セルフ、self.parsers) DEFのselect_parser(セルフ、リクエスト、パーサ): #media_typeこのとrequest.content_type比較を超えると、パーサが返されます、次いでパーサ分析メソッド呼び出し #各レゾルバ=「マルチパート/フォームデータMEDIA_TYPEた 」 属性 のためのパーサを中:パーサ IF :media_type_matches(parser.media_type、request.content_type) リターンパーサ リターンなし 。4が最終的にパーサを呼び出しを解析された= parser.parse(ストリーム、media_typeこの、解決するための分析方法 self.parser_contextを)
1つの要求实例化、パーサ= self.get_parsers() 要求( リクエスト、 パーサ = self.get_parsers()、 オーセンティケータ = self.get_authenticators()、 交渉 = self.get_content_negotiator()、 parser_context = parser_context ) 2 方法get_parsers、循环实例化出self.parser_classes中类对象 DEF get_parsers(自己): リターン [パーサ()のためのパーサでself.parser_classes] 3self.parser_classesは、クラス自体を見つけるために開始し、内すなわちAPIVIewを見つける親見つけることができない parser_classes = api_settings.DEFAULT_PARSER_CLASSESを 4 api_settingsオブジェクトである、オブジェクトはDEFAULT_PARSER_CLASSES特性が見つからない、方法がGETATTRすることで見出すことであった DEF __getattr__ 、自己( :ATTR) のIF ATTR ない で:self.defaults 昇給はAttributeError(" : 'S%'無効なAPIの設定"%のATTR) のtry : #通話self.user_settings方法が辞書を返し、辞書は、attrに属性を取る ヴァル= self.user_settings [ATTR] を除くKeyError例外: #は、デフォルトに戻る秋 ヴァル= self.defaults [attrの] #強制インポート文字列クラスをINTO IF ATTR 中:self.import_strings ヴァル = perform_import(ヴァル、ATTR) #キャッシュ結果で self._cached_attrs.add(ATTR) SETATTR(セルフ、 ATTR、ヴァル)が 返すヴァル 5 REST_FRAMEWORKプロパティを見つけるために、設定ファイルを設定することにより、反射しuser_settings方法を、空の辞書を返し、見つけることができません @Property DEFのuser_settings(セルフ): IF ない(自己、はhasattr 「_user_settingsを」): self._user_settings = GETATTR(設定、' REST_FRAMEWORK ' 、{}) 戻り self._user_settings
ソースプロセス:
-コールrequest.dataは、分析方法を実行するとき----「エンコーディングに応じて、パーサーオブジェクトを選択して上を通過、パーサオブジェクトパーサの完全な分析メソッドを呼び出します