目錄
- 1 請(qǐng)求和響應(yīng)
- 2 視圖
- 2.1 基于APIView寫接口
- 2.2 基于GenericAPIView寫的接口
- 2.3 基于GenericAPIView和5個(gè)視圖擴(kuò)展類寫的接口
- 2.4 使用ModelViewSet編寫5個(gè)接口
- 2.5 源碼分析ViewSetMixin
- 2.6 繼承ViewSetMixin的視圖類
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ù),都可以取出來
# 請(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格式,通過配置實(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è)視圖類有效
-在視圖類中寫如下
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寫接口
#### 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':'校驗(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/(?Ppk>\d+)', views.BookDetailView.as_view()),
2.2 基于GenericAPIView寫的接口
# views.py
class Book2View(GenericAPIView):
#queryset要傳queryset對(duì)象,查詢了所有的圖書
# serializer_class使用哪個(gè)序列化類來序列化這堆數(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重寫的
path('books2/', views.Book2View.as_view()),
re_path('books2/(?Ppk>\d+)', views.Book2DetailView.as_view()),
2.3 基于GenericAPIView和5個(gè)視圖擴(kuò)展類寫的接口
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ò)展類 重寫的
path('books3/', views.Book3View.as_view()),
re_path('books3/(?Ppk>\d+)', views.Book3DetailView.as_view()),
2.4 使用ModelViewSet編寫5個(gè)接口
# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet): #5個(gè)接口都有,但是路由有點(diǎn)問題
queryset = Book.objects
serializer_class = BookSerializer
# urls.py
# 使用ModelViewSet編寫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/(?Ppk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
2.5 源碼分析ViewSetMixin
# 重寫了as_view
# 核心代碼(所以路由中只要配置了對(duì)應(yīng)關(guān)系,比如{'get':'list'}),當(dāng)get請(qǐng)求來,就會(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的視圖類,路由可以改寫成這樣
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)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Django drf請(qǐng)求模塊源碼解析
- DRF跨域后端解決之django-cors-headers的使用
- django DRF圖片路徑問題的解決方法
- Django DRF APIView源碼運(yùn)行流程詳解
- Django DRF認(rèn)證組件流程實(shí)現(xiàn)原理詳解
- Django drf分頁器的使用詳解