Django Rest Framework -解析器

基本代碼結構

urls.py

rom django.conf.urls import url, include
from web.views.s5_parser import TestViewurlpatterns = [url(r'test/', TestView.as_view(), name='test'),
]

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework.parsers import JSONParserclass TestView(APIView):# JSONParser:請求頭content-type為application/json# FormParser:請求頭content-type為application/x-www-form-urlencoded# MultiPartParser: 請求頭content-type為multipart/form-data#  FileUploadParser:上傳文件parser_classes = [JSONParser, FormParser, MultiPartParser, FileUploadParser, ]def post(self, request, *args, **kwargs):print(request.content_type)# 獲取請求的值,并使用對應的JSONParser進行處理print(request.data)# application/x-www-form-urlencoded 或 multipart/form-data時,request.POST中才有值print(request.POST)print(request.FILES)return Response('POST請求,響應內容')def put(self, request, *args, **kwargs):return Response('PUT請求,響應內容')

  parser_classes屬性變量中的值,是各種解析器對象。前端會向后臺發送不同類型的請求,而django后臺的drf接口必須通過配置解析器才能獲取到相關請求數據。常用的解析器主要是“JSONParser”和“FormParser”這兩個解析器。

源碼分析

1.為什么使用parser_classes屬性變量,它有什么用?

?

同樣還是從APIView類的入口方法dispatch入口,在dispatch方法中,調用了initialize_request方法。這個方法在前文中已經說過,是用來封裝django原生的request請求的。由上圖知道,django原生的request請求數據被封裝到了Request對象中,在實例化該對象時,將解析數據的解析器初始化到了parsers屬性變量中。跳轉到get_parsers方法中,可以看到,同樣也是返回的是列表生成式。

再跳轉回APIView類中,可以看到屬性變量parser_classes定義的地方。同樣也可以通過settings配置文件進行全局配置。如果不需要進行全局配置,那就要在自定義的視圖類中對parser_classes屬性變量進行重新賦值,即:“parser_classes = [JSONParser, FormParser, MultiPartParser, FileUploadParser,]”。這列表元素都是解析器對象,只要這樣配置好,drf就會根據parser_classes中的解析器去解析數據。

?2.為什么從request.data中獲取數據?

看到這里,心中有了疑惑,Django Rest Framework框架是在那里觸發解析器這個功能的,在上面的源碼分析中并未調用任何一個關于解析相關功能的方法,只是做了一個讀取配置文件,封裝新的request對象的過程,所以是在我們需要讀數據的時候才會去觸發解析器這個功能,所以我們從request.data入手,我們知道,django原生的request請求,會被drf通過Request對象封裝,那么就跳轉到Request類定義中看看這個“data”的實現。在data方法的實現中可以看到前端請求的數據是通過“_load_data_and_files”方法獲取的,并且返回值是“_full_data”屬性變量。先跳轉到“_load_data_and_files”方法中:

?

在“_load_data_and_files”方法中可知,是通過調用“_parse”方法去獲取請求數據的,并且將請求數據保存在“_data”和“_files”屬性變量中。除文件相關的數據外的數據都保存在了“_data”中,而“_data”中的數據又都賦值到“_full_data”屬性變量中。又由上一張圖可知,“data”方法的返回值是“_full_data”,即:data方法獲取到的數據就是“_full_data”中的數據。

??

現在進一步分析_parse,首先第一步做的是獲取請求頭,可以看到將獲取到的請求頭保存到了“media_type”變量中。然后又通過調用“select_parser(self, self.parsers)”方法,來選擇所需要的解析器(參數“self.parsers”就是我們在自定義視圖中“parser_classes”的值)。

??

又通過,parser_classes中解析器對象中的parser方法來解析請求到的數據,即:“parsed = parser.parse(steam, media_type, self.parser_context)”。這里以“JSONParser”對象為例,由上圖可知,media_type屬性變量中保存的是該解析器所對應的請求頭,self.parser_context中,保存的是從前端請求中獲取到的請求頭。

  再來到“JSONParser”類的“parse”方法中可知,再通過返回“json.load”來處理請求數據。返回的請求數據就會保存到“Request”類的“_parse”方法中的parsed變量中。而_parse方法的返回值為元組,第一個元素就是需要的數據。這些數據會在“_load_data_and_files”方法中,賦值給“Request”類的“_data”屬性方法,而_data中的數據會賦值給“_full_data”中。因此,“Request”類中“data”方法返回值是“_full_data”,這樣,就可以通過“request.data”獲取請求數據。

全局配置

REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser''rest_framework.parsers.FormParser''rest_framework.parsers.MultiPartParser']
}

  配置加入不同的解析器,就會解析不同類型的請求數據,當然是可以同時配置加入多個解析器的。同樣的,配置了全局解析器后,那么,在自定義的視圖類中,就可以不用通過“parser_classes”屬性變量進行添加解析器的。

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

轉載于:https://www.cnblogs.com/kxsph/p/10596949.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449462.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

真格量化——菜粕策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期貨"].Login…

PostgreSQL查看版本信息

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.查看客戶端版本 psql --version 1 2.查看服務器端版本 2.1 查看詳細信息 select version(); 1 2.2 查看版本信息 show server_ve…

U盤版便攜式Linux制作, casper-rw 解析

一直都在想,不管用誰的電腦,我都可以得到一個完全一致的工作環境,上面有我喜愛的軟件,有我保存的重要資料,甚至瀏覽器的各種偏好都得一模一樣!現在的云計算技術可以部分解決這個問題,但是遠遠不…

真格量化-50ETF期權波動率策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np #日線級別 #開始時間,用于初始化一些參數 def OnStart(context) :print("I\m starting...")#設定一個全局變量品種,本策略交易50ETF期權g.code = Get…

canvas反向裁剪技巧

我們都知道在canvas 可以通過clip來實現剪裁功能,其步驟一般是先設置要裁剪的區域(路徑),然后通過ctx.clip()的實現裁剪,裁剪之后,后續的繪制只能在裁剪的區域顯示效果,比如如下一段代碼&#x…

set 和select 的區別

簡單賦值是沒有區別的 轉載于:https://www.cnblogs.com/bingyizhihun/p/10597908.html

postgres大版本升級

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。進行升級版本之前請一定做好備份!查看當前版本:[postgresnode1 ~]$ psqlpsql (9.4.4)Type "help" for h…

馬上有錢:揭密25種成為有錢人的方法(圖)

1、做你真正感興趣的事—你會花很多時間在上面,因此你一定要感興趣才行,如果不是這樣的話,你不愿意把時間花在上面,就得不到成功。 2、自己當老板。為別人打工,你絕不會變成巨富,老板一心一意地縮減開支&a…

無人承運平臺系統流程圖

轉載于:https://www.cnblogs.com/procedureMonkey/p/10598052.html

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

Centos7.5 啟動tomcat報錯 報錯: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program原因:沒有安裝java 解決方法:安裝java yum install java -y轉載于:https://www.cnblogs…

讓自己變成一個上進的人

1.認真設計你的環境2.引入外部監督 求“綁架”3.獲取不確定的反饋4.選擇一條既細密,又永無止境的職業上升臺階。轉載于:https://www.cnblogs.com/Julietma/p/10600241.html

年買筆記本的8個小技巧 最適合自己才最好(組圖)

顯然,智能手機和平板在一定程度上可以替代傳統電腦,讓我們可以隨時隨地上網、使用各種應用。不過,傳統電腦也擁有它的不可替代性,比如移動辦公、視頻編輯、玩游戲,筆記本電腦可能是個更好的選擇。 作為一種成熟的電腦…

MySql查詢系統時間,SQLServer查詢系統時間,Oracle查詢系統時間

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 MySQL查詢系統時間 第一種方法:select current_date; MySQL> select current_date as Systemtime; 第二…

flask同源策略解決辦法及flask-cors只允許特定域名跨域

falsk 同源策略解決辦法: 使用 flask-cors 包 并且 在代碼里 加響應的一行代碼解決。 from flask import Flask, session from flask_cors import CORSapp Flask(__name__) CORS(app, resources{r"/*": {"origins": "*"}}) # 允許…

基本變量和引用變量

基本數據類型作比較,值相等則相等,值不相等則不相等(忽略數據類型) 引用類型作比較,引用地址相等則相等,否則都是不等的。 基本數據類型,和引用數據類型作比較,是比較值是否相等&…

真格量化-持倉量第n檔賣方主力跟隨策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np import pandas as pd #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50E…

賺大錢必備 怎樣成為賺錢高手(圖)

1、一旦有賺錢的念頭就馬上一步一個腳印去做,要付諸行動,敢于碰,善于磨,只有這樣才能抓住機會。 2、想賺錢,就要立志當商人,而且目標要高,選定十萬、二十萬,再是一百萬、五百萬。 …

不定長圖片驗證碼訓練

基于LSTM和CTCLoss訓練不定長圖片驗證碼 Github項目地址:https://github.com/JansonJo/captcha_ocr.git # codingutf-8 """ 將三通道的圖片轉為灰度圖進行訓練 """ import itertools import os import re import random import strin…

[云框架]KONG API Gateway v1.5 -框架說明、快速部署、插件開發

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 當前版本采用KONGv0.12.3 當我們決定對應用進行微服務改造時,應用客戶端如何與微服務交互的問題也隨之而來,畢竟…

真格量化-主力跟買策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np import pandas as pd #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50E…