DRF之解析器元件

2021-09-26 14:52:28 字數 4774 閱讀 4275

django 原生解析器

from django.core.handlers.wsgi import wsgirequest

post = property(_get_post, _set_post), 找 def _load_post_and_files(self)函式,判斷型別,然後進行解析封裝。只支援 content_type == 『multipart/from-data』 。也可以進行自定義封裝,但是遵循開放封閉原則,不要更改源**。

)drf的解析器

from rest_framework.views import apiview

from rest_framework.parsers import formparser

class

loginview

(apiview)

: parser_classes =

[formparser]

# 此時加了固定的解析器,就只能解析formdata了

defget

(self, request)

:return render(request,

'login.html'

)def

post

(self, request)

:# print(request.post)

# origin_data = request.body

# parsed_data = origin_data.decode('utf-8')

# print(parsed_data)

print

(request.data)

# request.data 是乙個函式,乙個 porperty 裝飾的方法

loginview 裡面沒有 as_view 方法,到父類 apiview 去找

執行 view 裡面得 as_view() 方法,返回函式

def

view

(request,

*args,

**kwargs)

: self = cls(

**initkwargs)

ifhasattr

(self,

'get'

)and

nothasattr

(self,

'head'):

self.head = self.get

self.request = request

self.args = args

self.kwargs = kwargs

return self.dispatch(

)

url 和檢視函式之間得繫結關係建立完畢,等待使用者請求

接受到使用者請i去:login,到建立好的繫結關係裡面執行對應得檢視函式:view(request)

檢視函式的執行結構是什麼就返回給使用者什麼:self.dispatch(),self.diaptch() 的執行結果是什麼,就返回給使用者是什麼

此時的 self 代表的就是 loginview 物件

開始找 dispatch 方法,self裡面沒有,loginview裡面沒有,在apiview裡面有

開始執行 apiview 裡面的 dispatch

最後找到 http 方法(get,post,put,delete)

開始執行找到的方法(get),self.get(), self此時代表loginview的例項化物件

11.1 假設接收到的是post請求, 執行request.data

11.2 根據分析,所有的解析工作都在request.data裡面實現,且data是乙個方法(被裝飾後的)

11.2 開始執行request.data

@property

defdata

(self):if

not _hasattr(self,

'_full_data'):

self._load_data_and_files(

)return self._full_data

11.3 執行self._load_data_and_files

11.4 執行self._data, self._files = self._parse(

)11.5 parser = self.negotiator.select_parser(self, self.parsers)

11.5

.1 開始找self.parsers

11.5

.2 self.get_parses(

)[ parse(

)for parse in self.parser_classes ]

11.5

.3 parser_classes = api_settings.default_parser_classes

11.5

.4from rest_framework import api_settings

11.5

.5 api_settings = apisettings(

none

, defaults, import_strings)

11.5

.6class

apisettings()

:pass

11.5

.7 找不到default_parser_classes,__getattr__

'default_parser_classes':(

'rest_framework.parsers.jsonparser'

,'rest_framework.parsers.formparser'

,'rest_framework.parsers.multipartparser'),

11.5

.8 首先找程式的settings

11.5

.9 然後找rest_framework的settings

11.6 self._data就是我們想要的資料

11.7 drf將self._data = data

11.8 request.data

drf的所有功能都是在as_view() 和 dispatch裡面重寫的

而解析器元件在 dispatch 方法裡面重寫了,具體是在重新封裝的request物件裡面

#  原始碼

class

loginview

(apiview)

:def

get(self, request)

:pass

defpost

(self, request)

: request.data # 新的request物件 @property

return

class

apiview

(view)

: @classmethod

defas_view

(cls,

**initkwargs)

:pass

super

(apiview, cls)

.as_view(

**initkwargs)

definitialize_request

(self, request,

*args,

**kwargs)

:from rest_framework.request import request

return request(

request,

# 原生request物件

parsers=self.get_parsers(),

# authenticators=self.get_authenticators(),

negotiator=self.get_content_negotiator(),

parser_context=parser_context

)def

dispatch

(self)

:pass

request = self.initialize_request(request,

*args,

**kwargs)

self.request = request

defget_parsers

(self)

:return

[parser(

)for parser in self.parser_classes]

小談DRF之解析器相關

5.1.1 request.post中如何才能取到值?要求 資料格式的要求 5.1.2 檢視原始碼 先看我們寫的 from django.conf.urls import url from django.contrib import admin urlpatterns url r admin adm...

DRF筆記六 解析器

b ajax提交 根據請求頭 content type 選擇對應的解析器就請求體內容進行處理。url.py from django.conf.urls import url,include from web.views.s5 parser import testview urlpatterns ur...

DRF 的解析器和渲染器

解析器的作用就是服務端接收客戶端傳過來的資料,把資料解析成自己可以處理的資料。本質就是對請求體中的資料進行解析。在了解解析器之前,我們要先知道accept以及contenttype請求頭。accept是告訴對方我能解析什麼樣的資料,通常也可以表示我想要什麼樣的資料。contenttype是告訴對方我...