残りのフレームワークパーサ

パーサアクション:

  対応する選択に応じて、リクエストボディコンテンツ要求コンテンツタイプヘッダパーサを処理します。

  そこアプリケーション/ 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は、分析方法を実行するとき----「エンコーディングに応じて、パーサーオブジェクトを選択して上を通過、パーサオブジェクトパーサの完全な分析メソッドを呼び出します

おすすめ

転載: www.cnblogs.com/HUIWANG/p/11138662.html