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

Rest_Framework由淺入深:從CBV到ModelViewSet源碼一步步解析

這篇具有很好參考價值的文章主要介紹了Rest_Framework由淺入深:從CBV到ModelViewSet源碼一步步解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Rest_Framework由淺入深:從CBV到ModelViewSet源碼一步步解析

1、Django Rest_Framework介紹

Django REST framework是一個建立在Django基礎(chǔ)之上的Web應(yīng)用開發(fā)框架,可以快速的開發(fā)REST API接口應(yīng)用。在REST framework中,提供了序列化器Serialzier的定義,可以幫助我們簡化序列化與反序列化的過程,不僅如此,還提供豐富的類視圖、擴展類、視圖集來簡化視圖的編寫工作。REST framework還提供了認證、權(quán)限、限流、過濾、分頁、接口文檔等功能支持。REST framework提供了一個APIWeb可視化界面來方便查看測試接口。

2、特點

a、提供了定義序列化器Serializer的方法,可以快速根據(jù) Django ORM或者其它庫自動序列化、反序列化;
b、提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫,豐富的定制層級:函數(shù)視圖、類視圖、視圖集合到自動生成 API;
c、滿足各種需要多種身份認證和權(quán)限認證方式的支持內(nèi)置了限流系統(tǒng)直觀的 API web 界面,可以方便我們調(diào)試開發(fā)api接口,可擴展性強,插件豐富。

一、Django的CBV

1、執(zhí)行順序:

先從路由的as_view() 開始,
執(zhí)行BookView類繼承的View類里的as_view() 里的view(),
view() 的返回值是View類的dispatch(),
dispatch() 進行分發(fā)執(zhí)行getpost、put等方法。

views.py

# author xsy

from django.views import View

class BookView(View):

    def get(self,request):
        return HttpResponse('get')
    def post(self,request):
        return HttpResponse('post')

urls.py

# author xsy

from django.urls import path
from .views import *
urlpatterns = [
    path('book/', BookView.as_view()),
]

View類的大概邏輯

# author xsy

class View():

    def as_view(cls, **initkwargs):
        def view(self):
            return self.dispatch()
        return view
    
    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr( self, request.method.lower(), self.http_method_not_allowed )
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

二、DRF的APIView

1、相比原生django的優(yōu)勢:

a、django原生的request.POST存在只會解析uriencoded 不會解析json的問題;
b、APIView類的dispatch方法解決該問題,而且還會對請求的客戶端進行身份認證、權(quán)限檢查、流量控制。

2、執(zhí)行順序:

先從路由的as_view() 開始,
執(zhí)行BookView類繼承的APIView類里的as_view(),
而該as_view() 在內(nèi)部重寫了APIView類的父類Viewas_view() 方法,
所以執(zhí)行的是父類Viewas_view(),
Viewas_view()方法在內(nèi)部的返回值是dispatch()
dispatch()是先從APIView類里查找,
因為APIView類有dispatch(),
所以最終執(zhí)行的是APIView類的dispatch() 進行分發(fā)。

views.py

# author xsy

from rest_framework.views import APIView

class BookView(APIView):

    def get(self,request):
        return HttpResponse('get')
    def post(self,request):
        return HttpResponse('post')

APIView類的大概邏輯

# author xsy

# APIView的父類View的邏輯
class View():

    def as_view(cls, **initkwargs):
        def view(self):
            return self.dispatch()
        return view
    
    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr( self, request.method.lower(), self.http_method_not_allowed )
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
        
class APIView(View):
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs)
        return csrf_exempt(view)

    def dispatch(self, request, *args, **kwargs):
        # 構(gòu)建新的request對象
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request
        # 初始化:認證、權(quán)限、限流組件三件套

        if request.method.lower() in self.http_method_names:
            handler = getattr( self, request.method.lower(), self.http_method_not_allowed )
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

三、序列化器

1、使用Serializer和APIView

Serializer進行序列化和反序列化
數(shù)據(jù)庫的數(shù)據(jù)到前端進行序列化
前端的數(shù)據(jù)上傳到數(shù)據(jù)庫進行反序列化

a、**serializer.save()**的邏輯:

如果self.instance is not None執(zhí)行update()
否則執(zhí)行create() 分別對應(yīng)put()post()
BaseSerializer類里的create()update()必須重寫
所以
Bookserializers
類里有這兩個方法

b、serializer.data

BookView類get()返回的serializer.data,是Serializer類data()
該方法重寫了Serializer類的父類BaseSerializer類的data()方法
model.py

# author xsy

from django.db import models

# Create your models here.

class Books(models.Model):
    title = models.CharField(max_length=32,verbose_name="書籍名稱")
    price = models.IntegerField(verbose_name="價格")

serializers.py

# author xsy

from rest_framework import serializers
from .models import *
class Bookserializers(serializers.Serializer):
    title = serializers.CharField(max_length=16)
    price = serializers.IntegerField()
    # 使用下面這種可以修改名稱
    # jiaqian = serializers.IntegerField(source='price')

    def create(self, validated_data):
        newbook = Books.objects.create(**self.validated_data)
        return newbook
    def update(self, instance, validated_data):
        Books.objects.filter(pk=instance.pk).update(**self.validated_data)
        update_book = Books.objects.get(pk=instance.pk)
        return update_book

views.py

# author xsy

from rest_framework.views import APIView
# 不使用djangO自帶的HttpResponse  而是用rest_framework的Response可以將返回值變成json
from rest_framework.response import Response
from .models import *
from .serializers import *

class BookView(APIView):
    def get(self,request):
        books = Books.objects.all()
        serializer = Bookserializers(instance=books,many=True)
        return Response(serializer.data)
    def post(self,request):
        serializer = Bookserializers(data=request.data)
        if serializer.is_valid():
            # Books.objects.create(**serializer.validated_data)
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

class BookDetailView(APIView):
    def get(self,request,id):
        book = Books.objects.get(pk=id)
        serializer = Bookserializers(instance=book,many=False)
        return Response(serializer.data)
    def put(self,request,id):
        serializer = Bookserializers(instance=Books.objects.get(pk=id),data=request.data)
        if serializer.is_valid():
            # Books.objects.filter(pk=id).update(**serializer.validated_data)
            # serializer.instance = Books.objects.get(pk=id)
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)
    def delete(self,request,id):
        Books.objects.get(pk=id).delete()
        return Response()

urls.py

# author xsy

from django.urls import path,re_path
from .views import *
urlpatterns = [
    path('books/', BookView.as_view()),
    re_path('book/(\d+)', BookDetailView.as_view()),
]

2、ModelSerializer和GenericAPIView

a、ModelSerializer相比Serializer

已經(jīng)將模型的字段在內(nèi)部進行封裝;
在內(nèi)部已經(jīng)重寫create()update();

b、GenericAPIView相當于進一步封裝APIView

1、GenericAPIView繼承APIView類,self.get_serializer_class()等于Bookserializers
2、而self.get_serializer等于self.get_serializer_class()
3、self.get_queryset() 等于取出多條數(shù)據(jù)
4、self.get_object() 等于取出一條數(shù)據(jù)
model.py

# author xsy

from django.db import models

# Create your models here.

class Books(models.Model):
    title = models.CharField(max_length=32,verbose_name="書籍名稱")
    price = models.IntegerField(verbose_name="價格")

serializers.py

# author xsy

class Bookserializers(serializers.ModelSerializer):

    class Meta:
        model = Books
        # fields = '__all__'
        fields = ['title','price']

views.py

# author xsy

from rest_framework.generics import GenericAPIView
from rest_framework.response import Response

class BookView(GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers
    def get(self, request):
        books = Books.objects.all()
        # serializer = Bookserializers(instance=self.get_queryset(),many=True)
        # self.get_serializer_class()等于Bookserializers
        # self.get_serializer_class()(instance=self.get_queryset(),many=True)
        serializer = self.get_serializer(instance=self.get_queryset(),many=True)
        return Response(serializer.data)
    def post(self,request):
        # serializer = Bookserializers(data=request.data)
        # serializer = self.get_serializer_class()(data=request.data)
        # 三行作用相同
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            # Books.objects.create(**serializer.validated_data)
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

class BookDetailView(GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers
    def get(self,request,pk):
        # book = Books.objects.get(pk=id)
        # serializer = Bookserializers(instance=book,many=False)
        serializer = self.get_serializer(instance=self.get_object(),many=False)
        return Response(serializer.data)
    def put(self,request,pk):
        # serializer = Bookserializers(instance=Books.objects.get(pk=id),data=request.data)
        serializer = self.get_serializer(instance=self.get_object(),data=request.data)
        if serializer.is_valid():
            # Books.objects.filter(pk=id).update(**serializer.validated_data)
            # serializer.instance = Books.objects.get(pk=id)
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)
    def delete(self,request,pk):
        # Books.objects.get(pk=id).delete()
        self.get_object().delete()
        return Response()

四、視圖

1、mixins

ListModelMixinlist方法對應(yīng)BookViewget方法
CreateModelMixincreate方法對應(yīng)BookViewpost方法
RetrieveModelMixinretrieve方法對應(yīng)BookDetailViewget方法
UpdateModelMixinupdate方法對應(yīng)BookDetailViewput方法
DestroyModelMixindestroy方法對應(yīng)BookDetailViewdelete方法
views.py

# author xsy

# #  #################### mixins  ################################

from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,DestroyModelMixin

class BookView(ListModelMixin,CreateModelMixin,GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

    def get(self,request):
        return self.list(request)
    def post(self,request):
        return self.create(request)

class BookDetailView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

    def get(self,request,pk):
        return self.retrieve(request,pk)
    def put(self,request,pk):
        return self.update(request,pk)
    def delete(self,request,pk):
        return self.destroy(request,pk)

2、mixins再封裝版

ListCreateAPIView類將list方法封裝到get方法里,將create方法封裝到post方法里
RetrieveUpdateDestroyAPIView類將retrieve封裝到get方法里,將update方法封裝到put方法里,將destroy方法封裝到delete方法里
views.py

# author xsy

# #  #################### mixins再封裝  #########################################

from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
class BookView(ListCreateAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

class BookDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

五、視圖的再次精簡化:GenericViewSet和ModelViewSet

1、GenericViewSet

BookView類繼承六個類,其中GenericViewSet類繼承的ViewSetMixin類實現(xiàn)了將路由傳的字典映射到對應(yīng)的方法,這樣才可以將BookViewBookDetailView和成一個類,而繼承的其他五個類對應(yīng)了增刪改查方法
views.py

# author xsy

#  #################### 四、GenericViewSet  #########################################

from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,DestroyModelMixin

class BookView(GenericViewSet,ListModelMixin,CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,DestroyModelMixin):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

urls.py

# author xsy

urlpatterns = [
    # GenericViewSet
    path('books/', BookView.as_view({'get':'list','post':'create'})),
    re_path('book/(?P<pk>\d+)', BookView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),
    ]

2、ModelViewSet

ModelViewSet類繼承了CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin,ListModelMixin,
GenericViewSet這六個類
views.py

# author xsy

from rest_framework.viewsets import ModelViewSet

class BookView(ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = Bookserializers

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

# author xsy

from rest_framework import routers

router = routers.DefaultRouter()
router.register('book',BookView)
urlpatterns = [

]
urlpatterns += router.urls

到了這里,關(guān)于Rest_Framework由淺入深:從CBV到ModelViewSet源碼一步步解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【個人筆記】由淺入深分析 ClickHouse

    項目中不少地方使用到ClickHouse,就對它做了一個相對深入一點的了解和研究。并對各種知識點及整理過程中的一些理解心得進行了匯總并分享出來,希望對其他同學(xué)能有幫助。 本文主要講解ClickHouse的特點、讀寫過程、存儲形式、索引、引擎、物化視圖等特性。 適合 入門和

    2024年01月20日
    瀏覽(29)
  • 【由淺入深學(xué)習(xí)MySQL】之索引進階

    【由淺入深學(xué)習(xí)MySQL】之索引進階

    本系列為:MySQL數(shù)據(jù)庫詳解,為千鋒資深教學(xué)老師獨家創(chuàng)作 致力于為大家講解清晰MySQL數(shù)據(jù)庫相關(guān)知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【關(guān)注】持續(xù)追更~ 文末有本文重點總結(jié),技術(shù)類問題,也歡迎大家和我們溝通交流! 從今天開始本系列

    2024年02月05日
    瀏覽(22)
  • 手拉手Vue組件由淺入深

    手拉手Vue組件由淺入深

    組件 (Component) 是 Vue.js 最強大的功能之一,它是html、css、js等的一個聚合體,封裝性和隔離性非常強。 組件化開發(fā): ??? 1、將一個具備完整功能的項目的一部分分割多處使用 ??? 2、加快項目的進度 ??? 3、可以進行項目的復(fù)用 組件注冊分為:全局注冊和局部注冊 目錄

    2024年01月18日
    瀏覽(22)
  • 由淺入深介紹 Python Websocket 編程

    由淺入深介紹 Python Websocket 編程

    1.1 websocket 協(xié)議簡介 Websocket協(xié)議是對http的改進,可以實現(xiàn)client 與 server之間的雙向通信; websocket連接一旦建立就始終保持,直到client或server 中斷連接,彌補了http無法保持長連接的不足,方便了客戶端應(yīng)用與服務(wù)器之間實時通信。 適用場景 html頁面實時更新, 客戶端的html頁面

    2024年02月03日
    瀏覽(22)
  • 由淺入深理解C#中的事件

    本文較長,給大家提供了目錄,可以直接看自己感興趣的部分。 前面介紹了C#中的委托,事件的很多部分都與委托類似。實際上,事件就像是專門用于某種特殊用途的簡單委托,事件包含了一個私有的委托,如下圖所示: 有關(guān)事件的私有委托需要了解的重要事項如下: 1、事

    2024年02月03日
    瀏覽(30)
  • Springboot3+EasyExcel由淺入深

    Springboot3+EasyExcel由淺入深

    環(huán)境介紹 技術(shù)棧 springboot3+easyexcel 軟件 版本 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3 EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。 他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。 官網(wǎng)https://easyexcel.opensource.ali

    2024年01月16日
    瀏覽(28)
  • 【由淺入深學(xué)MySQL】- MySQL連接查詢

    【由淺入深學(xué)MySQL】- MySQL連接查詢

    本系列為:MySQL數(shù)據(jù)庫詳解,為千鋒教育資深Java教學(xué)老師獨家創(chuàng)作 致力于為大家講解清晰MySQL數(shù)據(jù)庫相關(guān)知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【點個關(guān)注】持續(xù)追更~ 文末有重點總結(jié)和福利內(nèi)容! 技術(shù)類問題,也歡迎大家和我們溝通交流!

    2024年02月05日
    瀏覽(23)
  • 由淺入深了解機器學(xué)習(xí)和GPT原理

    由淺入深了解機器學(xué)習(xí)和GPT原理

    我不是一個機器學(xué)習(xí)專家,本來是一名軟件工程師,與人工智能的互動很少。我一直渴望深入了解機器學(xué)習(xí),但一直沒有找到適合自己的入門方式。這就是為什么,當谷歌在2015年11月開源TensorFlow時,我非常興奮,知道是時候開始學(xué)習(xí)之旅了。不想過于夸張,但對我來說,這就

    2024年02月09日
    瀏覽(20)
  • 什么是感知機——圖文并茂,由淺入深

    什么是感知機——圖文并茂,由淺入深

    生活中常常伴隨著各種各樣的邏輯判斷,比如看到遠方天空中飄來烏云,打開手機看到天氣預(yù)報說1小時后40%的概率下雨,此時時候我們常常會做出等會下雨,出門帶傘的判斷。 上述思考過程可以抽象為一個”與“的”神經(jīng)邏輯“。當”看到烏云“和”天氣預(yù)報40%下雨“同時

    2023年04月20日
    瀏覽(24)
  • 由淺入深剖析 Apollo(阿波羅)架構(gòu)

    由淺入深剖析 Apollo(阿波羅)架構(gòu)

    目錄 一、介紹 二、架構(gòu)和模塊 三、架構(gòu)剖析 1.最簡架構(gòu) ?2. 高可用保障 ?3.多接口擴展 四、總結(jié) Apollo(阿波羅)是攜程框架部研發(fā)并開源的一款生產(chǎn)級的配置中心產(chǎn)品,它能夠集中管理應(yīng)用在不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的

    2024年02月13日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包