国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

drf——反序列化校驗源碼(了解)、斷言、drf之請求和響應、視圖之兩個視圖基類

這篇具有很好參考價值的文章主要介紹了drf——反序列化校驗源碼(了解)、斷言、drf之請求和響應、視圖之兩個視圖基類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.模塊與包

# 模塊與包
	模塊:一個py文件 被別的py文件導入使用,這個py文件稱之為模塊,運行的這個py文件稱之為腳本文件
    包:一個文件夾下有__init__.py
        
# 模塊與包的導入問題

'''
1.導入模塊有相對導入和絕對導入,絕對導入的路徑是從環(huán)境變量開始的
2.導入任何模塊,如果使用絕對導入,都是從環(huán)境變量開始導起
3.腳本文件執(zhí)行的路徑,會自動加入環(huán)境變量
4.相對導入的話,是從當前py文件開始計算的
5.以腳本運行的文件,不能使用相對導入,只能用絕對導入
'''

2.反序列化校驗源碼分析(了解)

# 序列化類的校驗功能
	局部鉤子:必須 validate_字段名
    全局鉤子:validate
        
# 入口
	ser.is_valid 才做的校驗---》入口
    先從自己寫的BookSerializer類中找is_valid方法----》再到繼承的父類Serializer中找---》再到它的父類BaseSerializer中找----》is_valid---》還繼承了Field
    '''BookSerializer類中的is_valid方法'''
    	def is_valid(self, *, raise_exception=False):
            # self中沒有_validated_data,只有執(zhí)行完后,才有(校驗過后的數(shù)據(jù))
            if not hasattr(self, '_validated_data'):
                try:
                    # 核心---》這一句
                    # 想看它的源代碼,按住ctrl+鼠標點擊是不對的---》只能找當前類的父類,要從根上開始找
                    self._validated_data = self.run_validation(self.initial_data)
                except ValidationError as exc:
                    self._validated_data = {}
                    self._errors = exc.detail
                else:
                    self._errors = {}

            if self._errors and raise_exception:
                raise ValidationError(self.errors)

            return not bool(self._errors)
       
    """
    self.run_validation(self.initial_data)
    在Serializer中有run_validation這個方法先執(zhí)行這個
    """
    def run_validation(self, data=empty):
             # 局部鉤子
            value = self.to_internal_value(data)
            try:
                # 全局鉤子
                value = self.validate(value) # BookSerializer只要寫了,優(yōu)先執(zhí)行它的
            except (ValidationError, DjangoValidationError) as exc:
                raise ValidationError(detail=as_serializer_error(exc))
            return value
        
    """
    局部鉤子
    self.to_internal_value(data)---》Serializer類的方法
    """
    	def to_internal_value(self, data):
            for field in fields: #序列化類中寫的一個個的字段類的對象列表
                # 一個field是name對象,field.field_name字符串 name
                # self是誰的對象:序列化類的對象,BookSerializer的對象  validate_name
                validate_method = getattr(self, 'validate_' + field.field_name, None)
                try:
                    # 字段自己的校驗規(guī)則
                    validated_value = field.run_validation(primitive_value)
                    if validate_method is not None:
                        # 局部鉤子
                        validated_value = validate_method(validated_value)
                except ValidationError as exc:
                    errors[field.field_name] = exc.detail
                except DjangoValidationError as exc:
                    errors[field.field_name] = get_error_detail(exc)
                except SkipField:
                    pass
                else:
                    set_value(ret, field.source_attrs, validated_value)
            if errors:
                raise ValidationError(errors)
            return ret
        
# 總結
	ser.is_valid--->走局部鉤子的代碼---》是通過反射獲取BookSerializer中寫的局部鉤子函數(shù),如果寫了,就會執(zhí)行---》走全局鉤子代碼---》self.validate(value)---》只要序列化類中寫了,優(yōu)先走自己的

3.斷言

assert hasattr(self, 'initial_data'), (
            'Cannot call `.is_valid()` as no `data=` keyword argument was '
            'passed when instantiating the serializer instance.'
        )

# 斷言某個東西是我認為的,如果不是就拋異常
# 等同于if判斷+拋異常
def add(a,b):
    return a + b

res = add(8,9)
# assert res == 16,Exception('不等于16')
if not res == 16:
    raise Exception('不等于16')
print('隨便')

4.drf之請求

# 視圖類:APIView
# 序列化組件:Serializer,ModelSerializer
# drf:Request類的對象

4.1Request類對象的分析

1.data
	request.data 返回解析之后的請求體數(shù)據(jù)。類似于Django中標準的request.POST和request.FILES屬性,但提供如下特性:
    包含了解析之后的文件和非文件數(shù)據(jù)
    包含了對POST、PUT、PATCH請求方式解析后的數(shù)據(jù)
    利用了REST framework的parsers解析器,不僅支持表單類型數(shù)據(jù),也支持JSON數(shù)據(jù)
2..query_params
	request.query_params等同于request.GET 
3.其他的屬性用法跟之前一樣

4.2請求能夠接受的編碼格式

# urlencoded
# form-data
# json
三種都支持
可以限制只能接受某種或者某幾種編碼格式

# 限制方式一:在視圖類上寫--》只是局部視圖類有效
	# 總共有三個:JSONParser,FormParser, MultiPartParser
    class BookView(APIView):
        parser_classes = [JSONParser, FormParser]

# 限制方式二:在配置文件中寫---》全局有效
	# drf的配置(在rest_framework的setting中),統(tǒng)一寫成它
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            # 'rest_framework.parsers.FormParser',
            # 'rest_framework.parsers.MultiPartParser',
        ],
    }
    
# 全局配置了只支持json,局部想支持3個
	-只需要在局部,視圖類中,寫3個即可
    class BookView(APIView):
    	parser_classes = [JSONParser, FormParser,MultiPartParser]
        
 # 總結:能夠處理的請求方式編碼
	-優(yōu)先從視圖類中找
    -再去項目配置文件找
    -再去drf默認的配置中找

5.drf之響應

5.1響應類的對象Response

# return Response({'code':100})
data:響應體的內容,可以字符串,字典,列表
status:http響應狀態(tài)碼
   	drf把所有響應碼都定義成一個常量
template_name:模板名字,用瀏覽器訪問,看到好看的頁面,用postman訪問,返回正常數(shù)據(jù)
	-自定制頁面
    -根本不用    
headers:響應頭加數(shù)據(jù)(后面講跨域問題再講)
	-headers={'name':'lqz'}
content_type:響應編碼,一般不用

# 三個重要的:data,status,headers

5.2響應的格式

# 默認是兩種:純json,瀏覽器看到的樣子

# 限制方式一:在視圖類上寫---》只是局部視圖類有效
	# 總共有兩個:JSONRenderer,BrowsableAPIRenderer
    from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
    class BookView(APIView):
        renderer_classes = [JSONRenderer]
        
# 限制方式二:在配置文件中寫---》全局有效
    # drf的配置,統(tǒng)一寫成它
     REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            # 'rest_framework.renderers.BrowsableAPIRenderer',
        ],
    }
    
    
# 全局配置了只支持json,局部想支持2個
	-只需要在局部,視圖類中,寫2個即可
	from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
    class BookView(APIView):
        renderer_classes = [JSONRenderer,BrowsableAPIRenderer]

6.視圖之兩個視圖基類

# 視圖類:
	-APIView:之前用過
	-GenericAPIView:GenericAPIView繼承了APIView
    
    
    
# GenericAPIView
	-類屬性:
    	queryset:要序列化的所有數(shù)據(jù)
    	serializer_class:序列化類
        lookup_field = 'pk' :查詢單條時的key值
     -方法:
    	-get_queryset():獲取所有要序列化的數(shù)據(jù)【后期可以重寫】
        -get_serializer  : 返回序列化類
        -get_object :獲取單個對象
        
        
        
 #總結:以后繼承GenericAPIView寫接口
	1 必須配置類屬性
    	queryset
        serializer_class
     2 想獲取要序列化的所有數(shù)據(jù)
    	get_queryset()
     3 想使用序列化類:
    	get_serializer
     4 想拿單條
    	get_object

6.1使用APIView+序列化類+Response寫接口

from rest_framework.views import APIView

from .serializer import BookSerialzier
from rest_framework.response import Response
from .models import Book

# class BookView(APIView):
#     def get(self, request):
#         qs = Book.objects.all()
#         ser = BookSerialzier(qs, many=True)
#         return Response({'code': 100, 'msg': '成功', 'results': ser.data})
#
#     def post(self, request):
#         ser = BookSerialzier(data=request.data)
#         if ser.is_valid():
#             ser.save()
#             return Response({'code': 100, 'msg': '成功'})
#         else:
#             return Response({'code': 100, 'msg': ser.errors})
#
#
# class BookDetailView(APIView):
#     def get(self, request, pk):
#         book = Book.objects.all().get(pk=pk)
#         ser = BookSerialzier(book)
#         return Response({'code': 100, 'msg': '成功', 'results': ser.data})
#
#     def put(self, request, pk):
#         book = Book.objects.get(pk=pk)
#         ser = BookSerialzier(data=request.data, instance=book)
#         if ser.is_valid():
#             ser.save()
#             return Response({'code': 100, 'msg': '更新成功'})
#         else:
#             return Response({'code': 100, 'msg': ser.errors})

6.2 使用GenericAPIView+序列化類+Response寫接口

class BookView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    def get(self, request):
        qs = self.get_queryset()
        ser = self.get_serializer(qs, many=True)
        return Response({'code': 100, 'msg': '成功', 'results': ser.data})

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})


class BookDetailView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    def get(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(book)
        return Response({'code': 100, 'msg': '成功', 'results': ser.data})

    def put(self, request, pk):
        book = self.get_object()
        ser = self.get_serializer(data=request.data, instance=book)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '更新成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})

文章來源地址http://www.zghlxwxcb.cn/news/detail-455199.html

到了這里,關于drf——反序列化校驗源碼(了解)、斷言、drf之請求和響應、視圖之兩個視圖基類的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Web開發(fā)模式、API接口、restful規(guī)范、序列化和反序列化、drf安裝和快速使用、路由轉換器(復習)

    Web開發(fā)模式、API接口、restful規(guī)范、序列化和反序列化、drf安裝和快速使用、路由轉換器(復習)

    一 Web開發(fā)模式 1. 前后端混合開發(fā)模式 2.前后端分離開發(fā)模式 二 API接口 三 restful規(guī)范 四 序列化和反序列化 五 drf安裝和快速使用

    2024年02月10日
    瀏覽(22)
  • 一文了解Java序列化和反序列化:對象的存儲與傳輸

    一文了解Java序列化和反序列化:對象的存儲與傳輸

    Java序列化是一項強大而重要的技術,它允許我們將對象轉換為字節(jié)流,以便在存儲、傳輸和重建時使用。在本文中,我們將深入探討Java序列化的基本概念、使用方法以及一些應用場景。 Java序列化是指將對象轉換為字節(jié)流的過程,以便可以將其存儲到文件、數(shù)據(jù)庫或在網絡上

    2024年02月13日
    瀏覽(25)
  • JavaEE 初階篇-深入了解 I/O 高級流(緩沖流、交換流、數(shù)據(jù)流和序列化流)

    JavaEE 初階篇-深入了解 I/O 高級流(緩沖流、交換流、數(shù)據(jù)流和序列化流)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 緩沖流概述 ? ? ? ? 1.1 緩沖流的工作原理 ? ? ? ? 1.2 使用緩沖流的步驟 ? ? ? ? 1.3?字節(jié)緩沖流于字符緩沖流的區(qū)別 ? ? ? ? 1.4?字節(jié)緩沖流的實例 ? ? ? ? 1.5?字符緩沖流的實例

    2024年04月29日
    瀏覽(22)
  • 《Zookeeper》從零開始學Zookeeper源碼(二)之數(shù)據(jù)序列化與通信協(xié)議

    《Zookeeper》從零開始學Zookeeper源碼(二)之數(shù)據(jù)序列化與通信協(xié)議

    zookeeper的客戶端與服務端、服務端與服務端之間會進行一系列的網絡通信,在進行數(shù)據(jù)的傳輸過程中就涉及到序列化與反序列化,zookeeper使用 Jute 作為它的序列化組件,在使用的時候,需要序列化與反序列化的對象實現(xiàn) Record 接口并實現(xiàn)該接口的 serialize() 和 deserialize() 方法,

    2024年02月13日
    瀏覽(24)
  • 【序列化與反序列化】關于序列化與反序列化MessagePack的實踐

    【序列化與反序列化】關于序列化與反序列化MessagePack的實踐

    在進行序列化操作之前,我們還對系統(tǒng)進行壓測,通過 jvisualvm 分析cpu,線程,垃圾回收情況等;運用火焰圖 async-profiler 分析系統(tǒng)性能,找出程序中占用CPU資源時間最長的代碼塊。 代碼放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/ser

    2024年02月11日
    瀏覽(28)
  • 【網絡】序列化反序列化

    【網絡】序列化反序列化

    在前文《網絡編程套接字》中,我們實現(xiàn)了服務器與客戶端之間的字符串通信,這是非常簡單的通信,在實際使用的過程中,網絡需要傳輸?shù)牟粌H僅是字符串,更多的是結構化的數(shù)據(jù)(類似于 class , struct 類似的數(shù)據(jù))。 那么我們應該怎么發(fā)送這些結構化的數(shù)據(jù)呢? 如果我們

    2024年02月05日
    瀏覽(29)
  • 序列化,反序列化之實例

    序列化,反序列化之實例

    介紹文章 __construct() 當一個對象創(chuàng)建時自動調用 __destruct() 當對象被銷毀時自動調用 (php絕大多數(shù)情況下會自動調用銷毀對象) __sleep() 使**用serialize()函數(shù)時觸發(fā) __wakeup 使用unserialse()**函數(shù)時會自動調用 __toString 當一個對象被當作一個字符串被調用 __call() 在對象上下文中調用不

    2024年02月14日
    瀏覽(28)
  • 協(xié)議,序列化,反序列化,Json

    協(xié)議,序列化,反序列化,Json

    協(xié)議究竟是什么呢?首先得知道主機之間的網絡通信交互的是什么數(shù)據(jù),像平時使用聊天APP聊天可以清楚,用戶看到的不僅僅是聊天的文字,還能夠看到用戶的頭像昵稱等其他屬性。也就可以證明網絡通信不僅僅是交互字符串那么簡單。事實上網絡通信還可能會通過一個結構

    2024年02月13日
    瀏覽(25)
  • 【網絡】協(xié)議定制+序列化/反序列化

    【網絡】協(xié)議定制+序列化/反序列化

    如果光看定義很難理解序列化的意義,那么我們可以從另一個角度來推導出什么是序列化, 那么究竟序列化的目的是什么? 其實序列化最終的目的是為了對象可以 跨平臺存儲,和進行網絡傳輸 。而我們進行跨平臺存儲和網絡傳輸?shù)姆绞骄褪荌O,而我們的IO支持的數(shù)據(jù)格式就是

    2024年02月08日
    瀏覽(21)
  • Qt 對象序列化/反序列化

    閱讀本文大概需要 3 分鐘 日常開發(fā)過程中,避免不了對象序列化和反序列化,如果你使用 Qt 進行開發(fā),那么有一種方法實現(xiàn)起來非常簡單和容易。 我們知道 Qt 的元對象系統(tǒng)非常強大,基于此屬性我們可以實現(xiàn)對象的序列化和反序列化操作。 比如有一個學生類,包含以下幾

    2024年02月13日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包