DRF之請求與響應

目錄

一、模塊與包回顧

二、反序列化校驗源碼分析(了解)

三、斷言

四、drf之請求

【1】源碼分析

【2】配置視圖類能處理的編碼格式

五、drf之響應

【1】源碼

【2】響應編碼格式


一、模塊與包回顧

  • 模塊與包
    • 什么是模塊?
      • 一個py文件,被別的py文件導入使用,它就是模塊
      • 如果py文件,直接右鍵運行,它叫腳本文件
    • 什么是包?
      • 一個文件夾,下有 __init__.py ,和很多py文件,這個就是包

導入模塊或包使用的規則

'''0 導入模塊有相對導入和絕對導入,絕對的路徑是從環境變量開始的1 導入任何模塊,如果使用絕對導入,都是從環境變量開始導入起  import xx  #### xx所在路徑必須在環境變量from yy  import   ####yy所在路徑必須在環境變量中2 腳本文件執行的路徑,會自動加入環境變量3 相對導入的話,是從當前py文件開始計算的4 以腳本運行的文件,不能使用相對導入,只能用絕對導入5 pycharm 會把項目根路徑加入到環境變量---> 離開pycharm就不行了6 我們看到第三方包,都是絕對導入form 它自己的包名 import xx下載的第三方包,都在site-package中,而site-package一定在環境變量中
'''

二、反序列化校驗源碼分析(了解)

1 ?執行 ser.is_valid() 就會執行 反序列化的校驗 --->字段自己 --> 局部鉤子 ---> 全局鉤子

2 ?入口是:ser.is_valid() ---> BaseSerializer 找到了

????1 自己寫的BookSerializer ---> serializer.Serializer ----> BaseSerializer?

????2 源碼如下

def is_valid(self, *, raise_exception=False):# self 是 ser對象---》自己寫的BookSerializer的對象--》一開始沒有# 一旦有了,就不執行了,優化is_valid被多次調用,只會走一次校驗if not hasattr(self, '_validated_data'):try:# 一旦執行過,以后self中就有_validated_data# 接下來看self.run_validation(self.initial_data)self._validated_data = self.run_validation(self.initial_data)except ValidationError as exc:self._validated_data = {}self._errors = exc.detailelse:self._errors = {}if self._errors and raise_exception:raise ValidationError(self.errors)return not bool(self._errors)

?????3 self.run_validation(self.initial_data) ---> serializer.Serializer類的,不要按住ctrl點擊,否則會進 Field 類,看錯了

??????4 serializer.Serializer類的run_validation

def run_validation(self, data=empty):# data前端傳入的--{"name":"張三","age":68}# value是---》前端傳入的,字段自己校驗通過的字典---{"name":"張三","age":68}value = self.to_internal_value(data) # 執行局部鉤子try:self.run_validators(value) # 先不看,忽略掉# self 是 BookSerializer的對象,如果我們寫了全局鉤子,走我們自己的,如果沒寫,走父類的,父類    的根本沒做校驗# value={"name":"張三","age":68}value = self.validate(value)# 執行全局鉤子except (ValidationError, DjangoValidationError) as exc:raise ValidationError(detail=as_serializer_error(exc))return value

??????5 全局鉤子讀完了:self 是 BookSerializer的對象,如果我們寫了全局鉤子,走我們自己的,如果沒寫,走父類的,父類的根本沒做校驗
? ? ? 6 局部鉤子:value = self.to_internal_value(data)--》Serializer類的
? ? ? ? ?for循環著去BookSerializer的對象中反射 ?validate_字段名的方法,如果有就執行,沒有就不執行

def to_internal_value(self, data):for field in fields: # 序列化類中所有字段類的對象 name=CharField()# self 是BookSerializer類的對象# 去BookSerializer類中,反射  validate_field字段類的對象.field_namevalidate_method = getattr(self, 'validate_' + field.field_name, None)try:# 如果能拿到,說明咱么寫了局部鉤子if validate_method is not None:# 執行局部鉤子--》傳入了當前字段的value值validated_value = validate_method(validated_value)except ValidationError as exc:# 如果拋異常,會被捕獲errors[field.field_name] = exc.detailexcept DjangoValidationError as exc:errors[field.field_name] = get_error_detail(exc)except SkipField:passelse:set_value(ret, field.source_attrs, validated_value)if errors:raise ValidationError(errors)return ret
##### 讀了局部和全局鉤子的執行位置 #####
"保存,修改也好,都要用validated_data,它是最準確的"

三、斷言

a = 10# assert 后寫條件,只要不符合條件,就會拋AssertionError異常,后面寫異常信息
assert a == 11, ("不等于11,報錯了")# 等同于--->上面只要一行代碼,源碼中喜歡用
if not a == 11:raise Exception('不等于11,報錯了')# 源碼中使用
assert value is not None, '.validate() should return the validated data'

四、drf之請求

# Request 類的對象
from rest_framework.request import Request

【1】源碼分析

1 新的request
2 request.data  前端傳入的請求體中得數據,無論那種編碼
3 用起來跟之前一樣
4 老的request在request._request

【2】配置視圖類能處理的編碼格式

# 默認,視圖類的方法,可以處理任意編碼格式-urlencoded-form-data-json# 比如有的接口,只能接收json格式,其他格式都不能處理# 配置方式一:視圖類上配置
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
# JSONParser:json
# FormParser:urlencoded
# MultiPartParser:form-data
class TestView(APIView):# parser_classes = [JSONParser]parser_classes = [JSONParser,FormParser]def post(self, request):print(request.data)return Response('ok')
# 配置方式二:settings.py  配置文件中配置## 所有drf的配置,都要寫在REST_FRAMEWORK字典中 ##REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': [# 'rest_framework.parsers.JSONParser',# 'rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',],}# 全局使用某種,單某個視圖類,局部使用---> 優先用視圖類配置的---> 視圖類沒配置--> 項目配置文件  ---> 項目配置文件如果沒配置---> drf配置文件(默認三個都支持)-配置文件正常寫class TestView(APIView):parser_classes = [JSONParser,FormParser]# 一般我們做---> 只支持json
# 對于上傳的文件的接口---》單獨配置 只允許 form-data

五、drf之響應

from rest_framework.response import Response

【1】源碼

data=None  # 咱們給的字典或列表或字符串---> 最終放到了http響應體中返回了status=None # http響應狀態碼,默認是200,你可以改,改成from rest_framework import status 狀態碼 
"http響應狀態碼分別代表啥意思:200成功   201創建成功"template_name=None:用瀏覽器訪問好看的頁面--> 指定的--> 默認使用drf提供的--> 后期可以自己寫頁面,使用 
headers=None, # 響應頭
content_type=None # 響應編碼格式"""我們需要記住的
data
status
headers
"""

【2】響應編碼格式

# 配置方式跟請求解析類似# 方式一:在視圖類上配置
class TestView(APIView):renderer_classes = [JSONRenderer,BrowsableAPIRenderer]# 方式二:配置文件中配置
REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],}# 優先用 視圖類的---> 項目配置文件---> drf內置的(兩個都支持)

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

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

相關文章

android 常用注解,Android 開發小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通過靜態編譯檢測來提高代碼質量的一個注解工具。里面包含了 Android 開發中常用的代碼檢測注解,幫助開發者提高代碼質量。通過 SDK Manager下載 Android Support Repository 后,在 Gradle 中通過如下聲明…

codeforces B. Friends and Presents(二分+容斥)

題意:從1....v這些數中找到c1個數不能被x整除,c2個數不能被y整除! 并且這c1個數和這c2個數沒有相同的!給定c1, c2, x, y, 求最小的v的值! 思路: 二分容斥,二分找到v的值,…

android音量鍵廣播,音量控制鍵控制的音頻流(setVolumeControlStream)描述

音量控制鍵控制的音頻流(setVolumeControlStream)描述2021-01-03 16:18Android教程網 Android當開發多媒體應用或者游戲應用的時候,需要使用音量控制鍵來設置程序的音量大小,在Android系統中有多種音頻流,感興趣的朋友可以了解下當開發多媒體應用或者游戲應用的時候…

eclipse的使用

eclipse如何打開一個已存在的工程!先給eclipse創建一個workspace,這個workspace就是一個文件夾用來管理eclipse項目的,或者修改eclipse的workspace,選擇菜單file->switch workspace->other,選擇一個已經存在的workspace。將已經存在的項目導入到wo…

Android延伸布局到狀態欄,Android 狀態欄透明

前言:最近項目大量用到狀態欄透明,網上也出現很多庫可以直接拿來用,個人認為沒有必要那么重引用到一個庫(有木有同學和我有一樣的想法),所以研究了一番,在此做個記錄加強記憶也便后期查閱,如果無意中有幸能…

glassfish服務器默認的網頁所在的位置

http://localhost:8080/ 默認打開的網頁所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 轉載于:https://www.cnblogs.com/hujunzheng/p/4052920.html

華為HarmonyOS 鴻蒙,華為鴻蒙HarmonyOS2.0手機開發者Beta版正式發布

據悉,本次手機開發者Beta測試支持以下中國境內主制式手機及平板電腦。手機:全網通(5G雙卡)P40 、 全網通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G),型號清單為ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http協議客戶端向服務器端請求時一般需要發送的內容

out.println("GET /shopping/index.html HTTP/1.1");//請求行 包括請求方式,文件路徑, http協議版本(必寫)請求頭.... out.println("Aceept: */*");//客戶端能夠處理的文件類型(不是必須&#xff…

android oneshot自動播放bug,移動端常見bug匯總001

前言本文是摘錄整理了移動端常見的一些bug以及解決方案,第一篇,后面還會有持續的文章更新整理。點擊樣式閃動Q: 當你點擊一個鏈接或者通過Javascript定義的可點擊元素的時候,它就會出現一個半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 與 Integer.class

TYPE 表示的引用類型所對應的基本類型的Class對象! 轉載于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber啟動動畫,模仿Uber的啟動畫面(上)

啟動畫面(Splash Screen)——不但給開發者們提供了一個盡情發揮、創建有趣動畫的機會,也填補了App啟動時從終端慢吞吞地下載數據的時間。啟動畫面(動態的)對于App至關重要:它可以讓用戶不失興趣地耐心等待應用完成加載。盡管現在的啟動畫面多種多樣&…

java中產生對象的兩種方式

/** 普通new對象的過程!*/Person pp new Person();System.out.println(pp);/** 利用代用參數的構造器產生對象實例!* 首先獲得相應帶參數的構造器,然后利用構造器產生對象實例!*/pclass Class.forName("get_class_method.P…

智慧屏用鴻蒙的生態,緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?...

原標題:緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?12 月 21 日,華為正式發布了兩款智慧屏新品,智慧屏 S 系列和車載智慧屏,前者是智慧屏的新系列,后者則是新開辟的車機產品線。沒有意外…

java中反射機制通過字節碼文件對象獲取字段和函數的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因為age成員變量是私有的,所以會產生NoSuchFieldException異常Field ageField pclass.getDeclaredField("age");//獲得該對象反映此…

MySQL不能插入中文字符及中文字符亂碼問題

MySQL的默認編碼是Latin1,不支持中文,要支持中午需要把數據庫的默認編碼修改為gbk或者utf8。在安裝后MySQL之后,它的配置文件不是很給力,不知道你們的是不是,反正我的是! 開始插入中文字符的時候出現如下錯…

android計算距離頂部的距離,(lua版)計算距離的邏輯是從Android的提供的接口(Location.distanceBetween)中拔來的,應該是最精確的方法了...

---coding by yuangu(lifulinghanaol.com)--用于計算2個pgs之間的距離function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…

codeforces C. Bits(數學題+或運算)

題意:給定一個區間,求區間中的一個數,這個數表示成二進制的時候,數字1的個數最多! 如果有多個這樣的數字,輸出最小的那個! 思路:對左區間的這個數lx的二進制 從右往左將0變成1&#…

密碼與確認密碼自動驗證html,HTML確認密碼

今天準備分享一個小知識點,就是確認登錄界面輸入戶名: 輸入密碼: 確認密碼: function validate() {var pw1 document.getElementById("pw1").value;var pw2 document.getElementById("pw2").value;if(pw1 …

實現單詞大小寫不敏感的正則表達式的匹配!

//實現單詞大小寫不敏感的正則表達式的匹配! //方法1: tmp "java java JavaJAVA"; px Pattern.compile("java", Pattern.CASE_INSENSITIVE); mx px.matcher(tmp); System.out.println(mx.replaceAll("JAVA")); //方法二…

r語言 發送郵件html,r語言讀取數據的方法

R 對于基于 SQL 語言的關系型數據庫有良好的支持,這些數據庫既有商業數據庫 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下發布的 MySQL 等開源數據庫。RMySQL 包中提供了到 MySQL 數據庫的接口;RO…