drfのモジュール

11439 ワード

1.紹介


pip install djangorestframeworkのインストール
登録:INSTALLED_APPSリストに「rest_framework”
drfフレームワークのパッケージスタイル:
import rest_framework
from rest_framework.views import View                    #  
from rest_framework.response import Response    #  
from rest_framework.request import Request    #  
from rest_framework.serializers import Serializer    #    
from rest_framework.settings import APISettings    #  
from rest_framework.filters import SearchFilter    #   
from rest_framework.pagination import PageNumberPagination #  
from rest_framework.authentication import TokenAuthentication    #  
from rest_framework.permissions import IsAuthenticated    #  
from rest_framework.throttling import SimpleRateThrottle    #  

 
drfリクエストライフサイクル:
1)リクエストはAPIViewのas_view関数;
2)APIViewでのas_view親Viewのas_を呼び出すview(Djangoオリジナル)、csrf認証も無効
3)親のas_viewでdispatchを配布する方法はAPIViewのdispatchです
4)タスク配布を完了し,ビュークラスへのリクエストメソッド処理を渡し,リクエストの応答結果を得てフロントに戻る.
主にAPIViewのdispatch法に注目する.
dispatchソース分析:
def dispatch(self, request, *args, **kwargs):
        """
        `.dispatch()` is pretty much the same as Django's regular dispatch,
        but with extra hooks for startup, finalize, and exception handling.
        """
        self.args = args
        self.kwargs = kwargs
        #    (    )
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        self.headers = self.default_response_headers  # deprecate?

        try:
            #      
            self.initial(request, *args, **kwargs)

            # Get the appropriate handler method
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed
#    
            response = handler(request, *args, **kwargs)

        except Exception as exc:
#    
            response = self.handle_exception(exc)
#    
        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

 

2.要求モジュール:requestオブジェクト


ソースエントリ:APIViewクラスのdispatchメソッド:request=self.initialize_request(request, *args, **kwargs)
 
getリクエストのデータ(パッチのパラメータ)は、3つの方法で得ることができます.
request._request.GET#二次パッケージ
request.GET#互換性
request.query_params#この拡張で
 
post要求データ(パケット)
request._request.POST     
request.POST
request.data#はdataでデータを取ることで、3つのデータ方式ですべて持つことができます
form-dataとurlencodedの場合、上記の3つはデータを取得できます.しかし,現局がjsonデータをコミットしている場合,dataのみが取得でき,その他は空である.
 
まとめ:
drfは原生requestを二次パッケージし、requestは原生のrequestです.
オリジナルrequestオブジェクトのプロパティとメソッドはdrfの_requestオブジェクトへの直接アクセス;
drfリクエストのすべてのパッチパラメータ(getリクエストが持つパラメータ)はquery_に解析されるparamsでは、すべてのパケットデータ(postリクエストのリクエストボディ内のデータ)がdataに解析される

3.レンダリングモジュール


jsonとbrowserブラウザの2つのレンダリング方法があります.
レンダリングモジュールソースエントリ:APIViewクラスのdispatchメソッド:self.response = self.finalize_response(request, response, *args, **kwargs)
グローバル構成:
settings.pyプロファイルでの構成REST_FRAMEWORKは、すべてのインタフェースをグローバルに構成するレンダリング方式(方式1:json文字列(postmanなど)を返すだけで、方式2:ブラウザ方式のデータ:応答情報とjsonデータがある)
ローカル構成:
カスタムクラスでクラス属性を定義します(親には見つかりません)
from rest_framework.renderers import JSONRenderer
render_classes=[JSOnRenderer]#反復するため、リストでなければなりません.
テンプレートレンダリング構成パス:カスタムビュークラス--->APIViewビュークラスを継承----->カスタムdrf構成---->drfデフォルト構成.
グローバル構成はカスタムdrf構成で変更され、カスタムビュークラスにクラス属性を追加します.
 

4.解析モジュール


url接合パラメータurl接合パラメータurl接合パラメータurl接合パラメータurl接合パラメータurl接合パラメータurl接合パラメータurl接合パラメータurl
パケットパラメータ:form-data、urlencoded、jsonの3種類があります.
解析モジュールソースエントリ:APIViewクラスのdispatchメソッドにおけるrequest=self.initialize_request(request, *args, **kwargs)
解析構成には、次の2つがあります.
グローバル解析クラス、ローカル解析クラス
グローバル構成:
settings.pyでのREST_FRAMEWORK辞書に、書き込み
'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ],      #     ,  3    

ローカル構成:
カスタムクラスに書く
from rest_framework.parsers import JSONParser
parser_classes = [JSONParser]    #             json       。

 

5.異常処理モジュール


異常モジュールソースエントリ:APIViewクラスのdispatchメソッドにおけるresponse=self.handle_exception(exc)
カスタム例外:
たとえばgetの値が取れない場合、query does not exist異常がフロントに表示されます.
1.settings.pyのREST_FRAMEWORK辞書におけるグローバル構成異常モジュール"EXECPTION_HANDLER":"api.exception.exception_handlerをget_exception_handlerがデフォルトの例外処理から自分で定義した例外処理関数に変更したカスタム例外はexception_を提供することです.handler異常処理関数は,responseに一定の値を与えることを目的とする.  2.アプリケーションの下でapiにexceptionsを新規作成する.pyファイルfrom rest_framework.views import exception_handler as drf_exception_handler form rest_framework.views import Response def exception_handler(exc, context):   response = drf_exception_handler(exc,context)#デフォルトのexception_に先に渡すhandler処理if response is None:#デフォルト処理異常時responseがNoneで直接フロントに表示されると、カスタムはインタフェース#if isinstance(exc,')に戻りexcの異なるタイプを判断し、異なる異常return Response({"detail":"サーバエラー")return responseを返す
 
ソースの論理分析:
まず、ソースコード入口はAPIViewクラスのdispatchメソッドにおけるresponse=selfである.handle_exception(exc),
handle_Exceptionでexceptionを実行します.handler = self.get_exception_handler()、exception_からhandlerでresponseを取得し、responseに値がある場合は戻り、値がない場合はフロントにエラーを報告します.get_exception_handlerはsettingsからexception_を取得しますhandler関数.exception_handlerは異常を処理する論理であり,responseを返すかNoneを返すかである.カスタムexception_handler関数を構成してカスタムの例外関数を指定すると、カスタムになります.また、デフォルトの例外処理を多重化するために、カスタム例外関数にデフォルトをインポートしてresponseを生成し、response処理(Noneなど、特定のエラーを返す)を行うことができます.
 
まとめ:
例外モジュールをカスタマイズする理由
1)drfを通過したAPIViewビュークラスで発生したすべての例外は、getデフォルトで例外が処理されず、フロントにエラーの詳細が表示されるなど、カスタム例外によって例外処理スキームを提供することができます.
2)drfのデフォルトでは、例外処理スキーム(rest_framework.views.exception_handler)が提供されています.単一処理の範囲は限られています.
3)drfが提供する処理方式は,処理したら処理情報を返し,処理しないでNoneを返す(後続はサーバが異常をフロントに投げつける).
4)カスタム異常の目的はdrfが処理していない異常を解決し,フロントに合理的な異常情報を得させ,バックグラウンドに異常具体情報を記録させることである.
 
処理シナリオ:
プロファイルの変更
REST_FRAMEWORK = {
 “EXECPTION_HANDLER” :”api.exception.exception_handler”
 }

カスタムexception_handler関数.
1)例外処理をrest_に渡すframework.viewsのexception_handlerは基礎処理をします
2)判断処理の結果(戻り値)response,ある値はdrfが処理したことを表し,値がない場合は自分で処理する.自分で処理し、excを異常判断し、異なる処理を行うことができます.は空の二次処理です.
 

6.応答モジュール


(1)応答クラスコンストラクタ
def __init__(self, data=None, status=None,
            template_name=None, header=None,
            exception=None, content_type=None):
        pass        

data:応答データ
status:http応答ステータスコード
content_type:親を継承します.デフォルトはjsonで、設定しません.
その他は知るまでもありません.
カスタム例外が返されるResponseに直接有名な実パラメータを付けます.
return Response({
    “detail”: “     ”
}, status=500, exception=True)

この500は、定義された変数からインポートできます:from rest_framework import status
status=status.HTTP_500_INTERNAL_SERVER_ERROR
応答オブジェクトの一般的なインスタンス化:
return Response(data={データ},status=XXX,headers={設定された応答ヘッダ})