欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

DRF之請(qǐng)求與響應(yīng)的實(shí)現(xiàn)

 更新時(shí)間:2021年07月11日 15:52:46   作者:暗黑妹妹  
本文主要介紹了DRF請(qǐng)求與響應(yīng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1 請(qǐng)求和響應(yīng)

1.1 請(qǐng)求

# 請(qǐng)求對(duì)象
# from rest_framework.request import Request
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        # 二次封裝request,將原生request作為drf request對(duì)象的 _request 屬性
        self._request = request
    def __getattr__(self,item):
     return getattr(self._request,item)
# 請(qǐng)求對(duì)象.data:前端以三種編碼方式傳入的數(shù)據(jù),都可以取出來(lái)
# 請(qǐng)求對(duì)象..query_params 與Django標(biāo)準(zhǔn)的request.GET相同,只是更換了更正確的名稱而已。

1.2 響應(yīng)

#from rest_framework.response import Response
 def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
#data:你要返回的數(shù)據(jù),字典
#status:返回的狀態(tài)碼,默認(rèn)是200,
 -from rest_framework import status在這個(gè)路徑下,它把所有使用到的狀態(tài)碼都定義成了常量
#template_name 渲染的模板名字(自定制模板),不需要了解
#headers:響應(yīng)頭,可以往響應(yīng)頭放東西,就是一個(gè)字典
#content_type:響應(yīng)的編碼格式,application/json和text/html;

# 瀏覽器響應(yīng)成瀏覽器的格式,postman響應(yīng)成json格式,通過(guò)配置實(shí)現(xiàn)的(默認(rèn)配置)
#不管是postman還是瀏覽器,都返回json格式數(shù)據(jù)
# drf有默認(rèn)的配置文件---》先從項(xiàng)目的setting中找,找不到,采用默認(rèn)的
# drf的配置信息,先從自己類中找--》項(xiàng)目的setting中找---》默認(rèn)的找
 -局部使用:對(duì)某個(gè)視圖類有效
        -在視圖類中寫(xiě)如下
        from rest_framework.renderers import JSONRenderer
        renderer_classes=[JSONRenderer,]
    -全局使用:全局的視圖類,所有請(qǐng)求,都有效
     -在setting.py中加入如下
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  # 默認(rèn)響應(yīng)渲染類
                'rest_framework.renderers.JSONRenderer',  # json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer',  # 瀏覽API渲染器
            )
        }

2 視圖

# 兩個(gè)視圖基類
APIView
GenericAPIView

2.1 基于APIView寫(xiě)接口

#### views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
# 基于APIView寫(xiě)的
class BookView(APIView):
    def get(self,request):
        book_list=Book.objects.all()
        book_ser=BookSerializer(book_list,many=True)

        return Response(book_ser.data)
    def post(self,request):
        book_ser = BookSerializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'校驗(yàn)失敗'})


class BookDetailView(APIView):
    def get(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(book)
        return Response(book_ser.data)

    def put(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '校驗(yàn)失敗'})

    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': '刪除成功'})
    
#models.py
class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publish=models.CharField(max_length=32)
#ser.py
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields='__all__'
# urls.py
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),

2.2 基于GenericAPIView寫(xiě)的接口

# views.py
class Book2View(GenericAPIView):
    #queryset要傳queryset對(duì)象,查詢了所有的圖書(shū)
    # serializer_class使用哪個(gè)序列化類來(lái)序列化這堆數(shù)據(jù)
    queryset=Book.objects
    # queryset=Book.objects.all()
    serializer_class = BookSerializer
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)

        return Response(book_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'校驗(yàn)失敗'})


class Book2DetailView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)

    def put(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '校驗(yàn)失敗'})

    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': '刪除成功'})
    
 #url.py
    # 使用GenericAPIView重寫(xiě)的
    path('books2/', views.Book2View.as_view()),
    re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),

2.3 基于GenericAPIView和5個(gè)視圖擴(kuò)展類寫(xiě)的接口

from rest_framework.mixins import  ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# views.py
class Book3View(GenericAPIView,ListModelMixin,CreateModelMixin):

    queryset=Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        return self.list(request)

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

class Book3DetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    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)
# urls.py
    # 使用GenericAPIView+5 個(gè)視圖擴(kuò)展類  重寫(xiě)的
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),

2.4 使用ModelViewSet編寫(xiě)5個(gè)接口

# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):  #5個(gè)接口都有,但是路由有點(diǎn)問(wèn)題
    queryset = Book.objects
    serializer_class = BookSerializer
    
# urls.py
# 使用ModelViewSet編寫(xiě)5個(gè)接口
    path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #當(dāng)路徑匹配,又是get請(qǐng)求,會(huì)執(zhí)行Book5View的list方法
    re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),

2.5 源碼分析ViewSetMixin

# 重寫(xiě)了as_view
# 核心代碼(所以路由中只要配置了對(duì)應(yīng)關(guān)系,比如{'get':'list'}),當(dāng)get請(qǐng)求來(lái),就會(huì)執(zhí)行l(wèi)ist方法
for method, action in actions.items():
    #method:get
    # action:list
    handler = getattr(self, action)
    #執(zhí)行完上一句,handler就變成了list的內(nèi)存地址
    setattr(self, method, handler)
    #執(zhí)行完上一句  對(duì)象.get=list
    #for循環(huán)執(zhí)行完畢 對(duì)象.get:對(duì)著list   對(duì)象.post:對(duì)著create

2.6 繼承ViewSetMixin的視圖類

# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): #一定要放在APIVIew前
    def get_all_book(self,request):
        print("xxxx")
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)
        return Response(book_ser.data)
    
# urls.py
    #繼承ViewSetMixin的視圖類,路由可以改寫(xiě)成這樣
    path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),

什么是正向代理,什么是反向代理

正向代理代理的對(duì)象是客戶端,反向代理代理的對(duì)象是服務(wù)端

到此這篇關(guān)于DRF之請(qǐng)求與響應(yīng)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)DRF 請(qǐng)求與響應(yīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django cookie和session的應(yīng)用場(chǎng)景及如何使用

    Django cookie和session的應(yīng)用場(chǎng)景及如何使用

    今天我們來(lái)重點(diǎn)看下Django中session和cookie的用法吧。我們會(huì)介紹cookie和session的工作原理,還會(huì)分享實(shí)際應(yīng)用的案例。
    2021-04-04
  • 使用Rasterio讀取柵格數(shù)據(jù)的實(shí)例講解

    使用Rasterio讀取柵格數(shù)據(jù)的實(shí)例講解

    今天小編就為大家分享一篇使用Rasterio讀取柵格數(shù)據(jù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python3 shelve對(duì)象持久存儲(chǔ)原理詳解

    Python3 shelve對(duì)象持久存儲(chǔ)原理詳解

    這篇文章主要介紹了Python3 shelve對(duì)象持久存儲(chǔ)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python處理和解析CLIXML數(shù)據(jù)的方法

    Python處理和解析CLIXML數(shù)據(jù)的方法

    在使用Windows的Windows Remote Management (WinRM)服務(wù)與PowerShell交互時(shí),經(jīng)常會(huì)遇到CLIXML(即CLI XML)格式的數(shù)據(jù),本文將介紹如何在Python中處理和解析CLIXML數(shù)據(jù),并提供一種方法來(lái)從數(shù)據(jù)中提取有效信息,需要的朋友可以參考下
    2024-04-04
  • Python實(shí)現(xiàn)k-means算法

    Python實(shí)現(xiàn)k-means算法

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)k-means算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù))

    python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù))

    這篇文章主要介紹了python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 通過(guò)numba模塊給Python代碼提速的方法詳解

    通過(guò)numba模塊給Python代碼提速的方法詳解

    numba是Anaconda公司開(kāi)發(fā)的針對(duì)Python的開(kāi)源JIT編譯器,用于提供Python版CPU和GPU編程,速度比原生Python快數(shù)十倍。本文將詳細(xì)介紹一下numba是如何實(shí)現(xiàn)代碼提速的,需要的可以參考一下
    2022-01-01
  • Python 中類的構(gòu)造方法 __New__的妙用

    Python 中類的構(gòu)造方法 __New__的妙用

    這篇文章主要介紹了Python 中類的構(gòu)造方法 New的妙用,Python 的類中,所有以雙下劃線__包起來(lái)的方法,叫魔術(shù)方法,魔術(shù)方法在類或?qū)ο蟮哪承┦录l(fā)出后可以自動(dòng)執(zhí)行,讓類具有神奇的魔力。下面就來(lái)學(xué)習(xí)文章的詳細(xì)內(nèi)容把
    2021-10-10
  • 關(guān)于Python中的排列組合生成器詳解

    關(guān)于Python中的排列組合生成器詳解

    這篇文章主要介紹了關(guān)于Python中的排列組合生成器詳解,在Python的內(nèi)置模塊?functools中,提供了高階類?product()?,用于實(shí)現(xiàn)多個(gè)可迭代對(duì)象中元素的組合,返回可迭代對(duì)象中元素組合的笛卡爾積,效果相當(dāng)于嵌套的循環(huán),需要的朋友可以參考下
    2023-07-07
  • python實(shí)現(xiàn)簡(jiǎn)易五子棋游戲(控制臺(tái)版)

    python實(shí)現(xiàn)簡(jiǎn)易五子棋游戲(控制臺(tái)版)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論