解析モジュールパーサの
設定ソース入口
大域解析クラスの構成を
#解析类全局配置 ' DEFAULT_PARSER_CLASSES ' :[ ' rest_framework.parsers.JSONParser ' 、 ' rest_framework.parsers.FormParser ' 、 ' rest_framework.parsers.MultiPartParser ' ]
ローカルで解決クラスコンフィギュレーション#
#局部解析配置 から rest_framework.parsers インポートJSONParserの クラスブック(APIViewを): parser_classes = [JSONParser] デフ(自己、要求、* argsを、**取得kwargsからの): リターン・レスポンス(' OK取得')
例外は、例外をモジュール
なぜカスタム例外:
Apivviewすべての例外は、DRFビュークラスを生成した後1.、例外処理のソリューションを提供することができます
2.drfデフォルトの例外処理スキーム(rest_framework.views.exception_handler)が、治療の限られた範囲
3。リターン例外情報を処理することによって提供される処置DRF 2つのスキーム、noneにリターンを処理する(そして例外は前にサーバーで投げる)ない
4.目標は、例外処理を定義することですので、も例外ではありませんので、フロントデスクでは、合理的なリターン例外情報を取得するために、バックグラウンド例外の記録情報
ソース入口:応答= self.handle_exception(EXC)
カスタム例外:
まず配置さREST_FRAMEWORK =設定{ #グローバル例外モジュール構成 ' 例外は、exception_handler ':' api.exception.exception_handler ' 、 } 2 。Exception.py新しいプロジェクトフォルダ名API 3ノックダウン=応答の例外は、exception_handler(EXC、コンテキスト)、空でない場合は、カスタムコンテンツを返す から rest_framework.viewsのインポートdrf_exception_handlerとして例外は、exception_handler から rest_framework.response インポートレスポンス DEFの:例外は、exception_handler(EXC、コンテキスト) レスポンス = drf_exception_handler(EXC、コンテキスト) IFレスポンスはありませんなし: 返すレスポンス({ 「詳細」:「サーバー障害のある」 }) 戻り応答を
モジュールのレスポンスレスポンス
レスポンスクラスのコンストラクタ
DEF __init__(自己、データ=なし、ステータス= なし、 テンプレート名 =なし、ヘッダ= なし、 例外 = Falseを、CONTENT_TYPE = なし): "" " :PARAMデータ:応答データ :PARAMステータス:応答ステータスコード :のparamテンプレート名: DRFページテンプレートアドレスレンダリング、ページをレンダリングすることができる PARAMヘッダー:レスポンスヘッダ :PARAM例外:異常かどうか のparam CONTENT_TYPE:レスポンスのデータ・フォーマット(通常、一般的にJSONで応答を処理していない) 「」" 一般的なインスタンス化を応答オブジェクト から rest_frameworkのインポートステータス を返す応答(データ= {データ}を、ステータス= status.HTTP_200_ok、ヘッダー= { }カスタムレスポンスヘッダ)
シリアライゼーションコンポーネント:シリアライザ(部分底面)
\ ModelSerializer(キー)\ ListModelSerializer(補助グループ変更)
シリアライザ:
1 フィールド名が大きすぎる。シリアライザは、主にオブジェクトを返すことができないフロントエンドに戻ってデータを返すために使用され、書き込みが不便である 2 。Serializers.pyは、最初のフォルダAPIのフォルダ、インポートモジュールの作成 から rest_frameworkのインポートシリアライザを 。3 。定義シリアライザシリアライゼーションクラスの #ジャンゴとシリアル化の組立作業は、同様の構成要素をfroms クラス:UserSerializer(serializers.Serializer) #以下を提供することができ、意思決定の前面に背景が提供するシリアライズ番号フィールドを、いくつかのフィールド名とビルド同じテーブル 名= serializers.CharField() 電話 = serializers.CharField() セックス = serializers.IntegerField() アイコン = serializers.ImageField() #カスタムシリアル化の属性 #は固定値がメソッドに名前を付けることにより、提供され、ランダムに属性名:get_メソッド、プロパティ名を(自己、参加シリアライズされたオブジェクトobjが)、カスタムプロパティの値を返します 性別= serializers.SerializerMethodField() DEFの自己(get_genderを、OBJ): #選択get_メソッドフィールド名_Displayの表示方法の正確なタイプは、() を返す)(obj.get_sex_display 4.シリアライザ定義user_ser = serializers.UserSerializer機能の観点から(USER_OBJ)、user_serに戻ります
デシリアライズ:
#は、データを受信したデシリアライズ、およびチェック、ストレージ
#1.user_ser = serializers.UserDeserializer(データ= request_data)デシリアライゼーション正当なコンテンツかどうかを確認 #2が正常に追加さにそれぞれローカルおよびグローバルフックを使用してフックにチェックサム検証単一のフィールドをデシリアライズライブラリ #のデシリアライズ クラスUserDeserializer(serializers.Serializer): #フィールド1が非直列化されなければならない #2フィールドのセキュリティチェックは何です #フィールドには、追加のチェックを提供する必要がある3 #関節のフィールドの間に存在している4チェック #の注意:カスタムフィールドを表示されない、非直列化ストレージが使用されており、検証ルールカスタムプロパティ提供することができる 名前= serializers.CharFieldを( MAX_LENGTH = 60 、 MIN_LENGTH。= 5 、 error_messages、 ={ ' MAX_LENGTH ':' 残念' 、 ' MIN_LENGTH ':' が短すぎたり' 、 } ) #最長と最短10超えない PSD = serializers.CharField() 電話 = serializers.CharField(=必須false)を セックス = serializers.IntegerField(必要= False)が #の検証すべきカスタムフィールド re_pwd = serializers.CharField(必須= 真) #ローカルフック:(現在のフィールドの値をチェックするために自己、)フィールド名を確認するためにvalidate_ #の検証ルール:チェックの元の値を返すことで、チェックが失敗し、例外がスローされる DEFのvalidate_name(自己、値): #の印刷(「値:」、値) IF 「JB 」 でvalue.lower(): 昇給 exceptions.ValidationError(「名前違法、文字がJB 」) の戻り値 #すべてのデータシステムとローカルフックを通じて:グローバルフックattrsには、 ATTRSは、すべてのデータの辞書です DEF :検証(自己、attrsに) #印刷( 'attrsに:'、ATTRS) PSD = attrs.get(「PSD" ) Re_pwd = attrs.get(" re_pwd " ) IF!PSD = re_pwd: 昇給 exceptions.ValidationError({ " PWD ":" 間違ったパスワード" }) 戻りATTRSの #作成したメソッドを書き換える必要があるように、新しいを完了するためには、 DEF 作成(自己、validated_data): #validated_data.pop(「re_pwd」) #可能な限りすべての検証ルールが完了した後、データストレージを直接することができ 返し models.User.objects.createを(** validated_data) #の3.Ifはのuser_ser.is_valid():によってかどうか #のストレージ・デシリアライズデータ受信 DEF POST(自己、要求、* argsを、** :kwargsから) request_data = request.data IF ないでisinstance(request.data、辞書を)または request_data == {}: #辞書、データ型の法的かどうか リターン応答({ 「ステータス」:1 、 「MSG 」:「データエラー」 }) #有効なデータ・タイプの後に、そのデータの内容は、法的ではないかもしれない、必要性チェックデータ #プリント(request.data) user_ser = serializers.UserDeserializer(データ= request_data) プリント(user_ser) 場合user_ser.is_valid(): #校验通过、完成新增 USER_OBJ = user_ser.save() 戻り応答({ ' ステータス' 。 0、 ' MSG ':" OK " 、 ' 結果' :serializers.UserSerializer(USER_OBJ).dataセクション }) 他: リターン応答({ ' ステータス':1 、 ' MSG ' :user_ser.errors })