Django REST framework 視圖和路由詳解
DRF中的Request
在Django REST Framework中內(nèi)置的Request類(lèi)擴(kuò)展了Django中的Request類(lèi),實(shí)現(xiàn)了很多方便的功能--如請(qǐng)求數(shù)據(jù)解析和認(rèn)證等。
比如,區(qū)別于Django中的request從request.GET中獲取URL參數(shù),從request.POST中取某些情況下的POST數(shù)據(jù)。
在APIView中封裝的request,就實(shí)現(xiàn)了請(qǐng)求數(shù)據(jù)的解析:
對(duì)于GET請(qǐng)求的參數(shù)我們通過(guò)request.query_params來(lái)獲取。
對(duì)于POST請(qǐng)求、PUT請(qǐng)求的數(shù)據(jù)我們通過(guò)request.data來(lái)獲取。
前提
序列化
from rest_framework import serializers
from app01 import models
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Comment
fields = "__all__"
extra_kwargs = {
"content": {"error_messages": {"required": "評(píng)論內(nèi)容不能為空"}},
"article": {"error_messages": {"required": "文章不能為空"}}
}
class SchoolSerializer(serializers.ModelSerializer):
class Meta:
model = models.School
fields = "__all__"
第一階段:手壘代碼
視圖
from rest_framework.views import APIView
class SchoolView(APIView):
def get(self, request, *args, **kwargs):
query_set = models.School.objects.all()
ser_obj = app01_serializers.SchoolSerializer(query_set, many=True)
return Response(ser_obj.data)
class SchoolDetail(APIView):
def get(self, request, pk, *args, **kwargs):
obj = models.School.objects.filter(pk=pk).first()
ser_obj = app01_serializers.SchoolSerializer(obj)
return Response(ser_obj.data)
第二階段:簡(jiǎn)單使用rest formwork自帶混合類(lèi)方法
視圖
from rest_framework.generics import GenericAPIView # 公共類(lèi)
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin # 混合類(lèi) 必須與公共類(lèi)搭配著使用
class SchoolView(GenericAPIView, mixins.ListModelMixin): # 查看學(xué)校列表
queryset = models.School.objects.all()
serializer_class = app01_serializers.SchoolSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
class SchoolDetail(GenericAPIView, mixins.RetrieveModelMixin, mixins.CreateModelMixin): # 創(chuàng)建,與具體查出某一條記錄
queryset = models.School.objects.all()
serializer_class = app01_serializers.SchoolSerializer
def get(self, request, pk, *args, **kwargs):
return self.retrieve(request, pk, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
路由
url(r'school/$', views.SchoolView.as_view()), url(r'school/(?P<pk>\d+)/$', views.SchoolDetail.as_view()),
第三階段:使用rest formwork自帶的通用類(lèi)方法
視圖
from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateAPIVie class SchoolView(ListCreateAPIView): # 創(chuàng)建 queryset = models.School.objects.all() serializer_class = app01_serializers.SchoolSerializer class SchoolDetail(RetrieveUpdateDestroyAPIView): # 更新 queryset = models.School.objects.all() serializer_class = app01_serializers.SchoolSerializer
路由同上
第四階段:使用rest formwork自帶的封裝所有放的類(lèi),代碼量最少,功能最全
視圖
from rest_framework.viewsets import ModelViewSet # 里面封裝了操作的所有方法,增刪改查查 class SchoolView(ModelViewSet): queryset = models.School.objects.all() serializer_class = app01_serializers.SchoolSerializer
路由
url(r'school/$', views.SchoolView.as_view(actions={
"get": "list",
"post": "create",
})),
url(r'school/(?P<pk>\d+)/$', views.SchoolView.as_view(actions={
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})),
高級(jí)路由
視圖
同上
路由
from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'school', views.SchoolView) urlpatterns += router.urls
精華:流程圖

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python Tornado 實(shí)現(xiàn)SSE服務(wù)端主動(dòng)推送方案
SSE是Server-Sent Events 的簡(jiǎn)稱(chēng),是一種服務(wù)器端到客戶端(瀏覽器)的單項(xiàng)消息推送,本文主要探索兩個(gè)方面的實(shí)踐一個(gè)是客戶端發(fā)送請(qǐng)求,服務(wù)端的返回是分多次進(jìn)行傳輸?shù)?直到傳輸完成,這種情況下請(qǐng)求結(jié)束后,考慮關(guān)閉SSE,所以這種連接可以認(rèn)為是暫時(shí)的,感興趣的朋友一起看看吧2024-01-01
在python中實(shí)現(xiàn)對(duì)list求和及求積
今天小編就為大家分享一篇在python中實(shí)現(xiàn)對(duì)list求和及求積,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Keras 加載已經(jīng)訓(xùn)練好的模型進(jìn)行預(yù)測(cè)操作
這篇文章主要介紹了Keras 加載已經(jīng)訓(xùn)練好的模型進(jìn)行預(yù)測(cè)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例例如直接插入排序、直接選擇排序、冒泡排序、快速排序等,需要的朋友可以參考下2014-06-06
Django中如何防范CSRF跨站點(diǎn)請(qǐng)求偽造攻擊的實(shí)現(xiàn)
這篇文章主要介紹了Django中如何防范CSRF跨站點(diǎn)請(qǐng)求偽造攻擊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
python實(shí)現(xiàn)定制交互式命令行的方法
這篇文章主要介紹了python實(shí)現(xiàn)定制交互式命令行的方法,需要的朋友可以參考下2014-07-07

