Django rest framework(5)----解析器

目錄html

解析器

 (1)api/urls.pydjango

# api/urls.py

from django.urls import path,re_path from .views import UserView,PaserView urlpatterns = [ re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'), path('paser/', PaserView.as_view(),),   #解析
]

(2)views.pyjson

from rest_framework.parsers import JSONParser,FormParser class PaserView(APIView): parser_classes = [JSONParser,FormParser,] #JSONParser:表示只能解析content-type:application/json的頭
    #FormParser:表示只能解析content-type:application/x-www-form-urlencoded的頭

    def post(self,request,*args,**kwargs): #獲取解析後的結果
        print(request.data) return HttpResponse('paser')

(3)經過postman發送Json數據api

 

 在後臺能夠獲取發過來的Json數據app

 

 

源碼流程

 (1)dispatchpost

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進行加工,豐富了一些功能
        #Request(
        # request,
        # parsers=self.get_parsers(),
        # authenticators=self.get_authenticators(),
        # negotiator=self.get_content_negotiator(),
        # parser_context=parser_context
        # )
        #request(原始request,[BasicAuthentications對象,])
        #獲取原生request,request._request
        #獲取認證類的對象,request.authticators
        #1.封裝request
        request = self.initialize_request(request, *args, **kwargs) self.request = request self.headers = self.default_response_headers  # deprecate?

        try: #2.認證
            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)initialize_requestthis

獲取全部解析器url

def initialize_request(self, request, *args, **kwargs): """ Returns the initial request object. """ parser_context = self.get_parser_context(request) return Request( request, parsers=self.get_parsers(),                  #獲取全部的解析器
            authenticators=self.get_authenticators(),    #[BasicAuthentication(),],把全部的認證類對象封裝到request裏面了
            negotiator=self.get_content_negotiator(), parser_context=parser_context )

(3)get_parsersspa

def get_parsers(self): """ Instantiates and returns the list of parsers that this view can use. """
        return [parser() for parser in self.parser_classes]

(4)parser_classes.net

 

 一樣咱們能夠在settings裏面全局配置

#全局配置
REST_FRAMEWORK = { #版本
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning", #解析器
    "DEFAULT_PARSER_CLASSES":["rest_framework.parsers.JSONParser","rest_framework.parsers.FormParser"] }
相關文章
相關標籤/搜索