DRF之請求與響應的實現(xiàn)
更新時間:2021年07月11日 15:52:46 作者:暗黑妹妹
本文主要介紹了DRF請求與響應的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
1 請求和響應
1.1 請求
# 請求對象 # from rest_framework.request import Request def __init__(self, request, parsers=None, authenticators=None, negotiator=None, parser_context=None): # 二次封裝request,將原生request作為drf request對象的 _request 屬性 self._request = request def __getattr__(self,item): return getattr(self._request,item) # 請求對象.data:前端以三種編碼方式傳入的數(shù)據(jù),都可以取出來 # 請求對象..query_params 與Django標準的request.GET相同,只是更換了更正確的名稱而已。
1.2 響應
#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)碼,默認是200, -from rest_framework import status在這個路徑下,它把所有使用到的狀態(tài)碼都定義成了常量 #template_name 渲染的模板名字(自定制模板),不需要了解 #headers:響應頭,可以往響應頭放東西,就是一個字典 #content_type:響應的編碼格式,application/json和text/html; # 瀏覽器響應成瀏覽器的格式,postman響應成json格式,通過配置實現(xiàn)的(默認配置) #不管是postman還是瀏覽器,都返回json格式數(shù)據(jù) # drf有默認的配置文件---》先從項目的setting中找,找不到,采用默認的 # drf的配置信息,先從自己類中找--》項目的setting中找---》默認的找 -局部使用:對某個視圖類有效 -在視圖類中寫如下 from rest_framework.renderers import JSONRenderer renderer_classes=[JSONRenderer,] -全局使用:全局的視圖類,所有請求,都有效 -在setting.py中加入如下 REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( # 默認響應渲染類 'rest_framework.renderers.JSONRenderer', # json渲染器 'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器 ) }
2 視圖
# 兩個視圖基類 APIView GenericAPIView
2.1 基于APIView寫接口
#### views.py from rest_framework.generics import GenericAPIView from app01.models import Book from app01.ser import BookSerializer # 基于APIView寫的 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':'校驗失敗'}) 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': '校驗失敗'}) 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寫的接口
# views.py class Book2View(GenericAPIView): #queryset要傳queryset對象,查詢了所有的圖書 # serializer_class使用哪個序列化類來序列化這堆數(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':'校驗失敗'}) 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': '校驗失敗'}) def delete(self,request,pk): ret=self.get_object().delete() return Response({'status': 100, 'msg': '刪除成功'}) #url.py # 使用GenericAPIView重寫的 path('books2/', views.Book2View.as_view()), re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),
2.3 基于GenericAPIView和5個視圖擴展類寫的接口
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 個視圖擴展類 重寫的 path('books3/', views.Book3View.as_view()), re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),
2.4 使用ModelViewSet編寫5個接口
# views.py from rest_framework.viewsets import ModelViewSet class Book5View(ModelViewSet): #5個接口都有,但是路由有點問題 queryset = Book.objects serializer_class = BookSerializer # urls.py # 使用ModelViewSet編寫5個接口 path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #當路徑匹配,又是get請求,會執(zhí)行Book5View的list方法 re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
2.5 源碼分析ViewSetMixin
# 重寫了as_view # 核心代碼(所以路由中只要配置了對應關(guān)系,比如{'get':'list'}),當get請求來,就會執(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í)行完上一句 對象.get=list #for循環(huán)執(zhí)行完畢 對象.get:對著list 對象.post:對著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的視圖類,路由可以改寫成這樣 path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),
什么是正向代理,什么是反向代理
正向代理代理的對象是客戶端,反向代理代理的對象是服務端
到此這篇關(guān)于DRF之請求與響應的實現(xiàn)的文章就介紹到這了,更多相關(guān)DRF 請求與響應內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django cookie和session的應用場景及如何使用
今天我們來重點看下Django中session和cookie的用法吧。我們會介紹cookie和session的工作原理,還會分享實際應用的案例。2021-04-04使用Rasterio讀取柵格數(shù)據(jù)的實例講解
今天小編就為大家分享一篇使用Rasterio讀取柵格數(shù)據(jù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python處理和解析CLIXML數(shù)據(jù)的方法
在使用Windows的Windows Remote Management (WinRM)服務與PowerShell交互時,經(jīng)常會遇到CLIXML(即CLI XML)格式的數(shù)據(jù),本文將介紹如何在Python中處理和解析CLIXML數(shù)據(jù),并提供一種方法來從數(shù)據(jù)中提取有效信息,需要的朋友可以參考下2024-04-04python十進制和二進制的轉(zhuǎn)換方法(含浮點數(shù))
這篇文章主要介紹了python十進制和二進制的轉(zhuǎn)換方法(含浮點數(shù)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Python 中類的構(gòu)造方法 __New__的妙用
這篇文章主要介紹了Python 中類的構(gòu)造方法 New的妙用,Python 的類中,所有以雙下劃線__包起來的方法,叫魔術(shù)方法,魔術(shù)方法在類或?qū)ο蟮哪承┦录l(fā)出后可以自動執(zhí)行,讓類具有神奇的魔力。下面就來學習文章的詳細內(nèi)容把2021-10-10