django 原生解析器
from django.core.handlers.wsgi import wsgirequestpost = 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)
(request.data)
# request.data 是乙個函式,乙個 porperty 裝飾的方法
loginview 裡面沒有 as_view 方法,到父類 apiview 去找
執行 view 裡面得 as_view() 方法,返回函式
url 和檢視函式之間得繫結關係建立完畢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(
)
,
等待使用者請求接受到使用者請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是告訴對方我...