as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]
系列文章介紹
本系列文章將詳細介紹將Django官方引導教程中的投票項目改寫為RESTful網絡服務。Django官方教程地址https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial01/
前置步驟
前置步驟請查看文末列出的文章列表中的前置文章。
- Step-1:RESTful與Django
- Step-2:創建項目和應用
- Step-3:使用原生Django編寫API
- Step-4:序列化與反序列化
Step-5:基于DRF的視圖類的視圖
使用APIView
我們將使用DRF中的APIView來重寫之前編寫的兩個視圖。我們了解過Django中的基于類的視圖,APIView封裝和繼承了Django原生的視圖類,并額外提供了部分功能。 新建一個polls/apiview.py,編寫代碼如下:
# in polls/apiview.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import get_object_or_404from .models import Poll, Choice
from .serializers import PollSerializerclass PollList(APIView):def get(self, request):polls = Poll.objects.all()[:20] # 從Poll模型對應的表中取出所有記錄,并切片前20條記錄。這是一個QuerySet類的實例,其中包含了如何取數的信息。serialized = PollSerializer(polls, many=True) # 利用QuerySet實例化一個序列化器。many=True表示,這是對多條記錄的請求。return Response(serialized.data) # serialized.data是一個有序字典對象class PollDetail(APIView):def get(self, request, pk):poll = get_object_or_404(Poll, pk=pk) # get_object_or_404要么取回記錄實例要么返回404 Not Found狀態serialized = PollSerializer(poll) # 序列化這個記錄實例return Response(data=serialized.data)我們再把url指向對應的新的視圖。
# in polls/ur.py
from django.urls import path
# from .views import polls_list, polls_detail
from .apiview import PollList, PollDetailurlpatterns = [path("polls/", PollList.as_view(), name="polls_list"), # .as_view()訪求返回的是一個函數。以.as_view()作為入口,這個序列化器實例會進行請求方法分發、執行視圖函數(方法)等操作。path("polls/<int:pk>/", PollDetail.as_view(), name="polls_detail"),
]使用DRF通用視圖簡化代碼
檢查之前寫的視圖,確認它是可以正常工作的,但是代碼有點冗余和麻煩。DRF為我們提供了通用視圖,它預封裝了許多有用的功能。
# in polls/apiview.py
from rest_framework import genericsfrom .models import Poll, Choice
from .serializers import PollSerializer, ChoiceSerializer, VoteSerializerclass PollList(generics.ListCreateAPIView):queryset = Poll.objects.all()serializer_class = PollSerializerclass PollDetail(generics.RetrieveUpdateDestroyAPIView):queryset = Poll.objects.all()serializer_class = PollSerializer對數據庫的操作,一般稱為CRUD或CRUDL,即Create(增加記錄),Retrieve或Read(查詢單條記錄),Update(修改記錄),Destroy或Delete(刪除記錄)。在本節之前,我們編寫的視圖中已經支持了List操作和Retrieve操作,還不能支持其他操作。 我們從generics.ListCreateAPIView類的名字上可以看出,它支持List、Create兩種視圖功能。其中List對應的HTTP動詞是GET,Create對應的HTTP動態是POST。 從generics.RetrieveUpdateDestroyAPIView的名字可以看出,它支持Retrieve、Update、Destroy,它可以取回單條記錄,修改單條記錄,,刪除單條記錄。Retrieve、Update、Destroy對應的HTTP動詞分別是GET、PUT、DELETE。 這些通用視圖類是如何支持多種操作的呢?這涉及到多繼承(也稱新式類,也稱混合類、混合繼承等)。在此不多述,在以后的文章中,希望能對通用視圖類展開來說。 現在我們打開http://127.0.0.1:8000/api-polls/polls/,可以發現,原來的數據仍能取回,而網頁下方,出現了一個可以提交POST請求的表單。
說明我們的視圖是支持POST的視圖了。
編寫其它視圖
# in polls/apiview.py
from rest_framework import genericsfrom .models import Poll, Choice
from .serializers import PollSerializer, ChoiceSerializer, VoteSerializerclass PollList(generics.ListCreateAPIView):queryset = Poll.objects.all()serializer_class = PollSerializerclass PollDetail(generics.RetrieveUpdateDestroyAPIView):queryset = Poll.objects.all()serializer_class = PollSerializerclass ChoiceList(generics.ListCreateAPIView):queryset = Choice.objects.all()serializer_class = ChoiceSerializerclass CreateVote(generics.CreateAPIView):# Vote只須要被創建serializer_class = VoteSerializer編寫polls/urls.py進行url分發。
# in polls/urls.py
from django.urls import path
# from .views import polls_list, polls_detail
from .apiview import PollList, PollDetail, ChoiceList, CreateVoteurlpatterns = [path("polls/", PollList.as_view(), name="polls_list"),path("polls/<int:pk>/", PollDetail.as_view(), name="polls_detail"),path('choices/', ChoiceList.as_view(), name='choice_list'),path('vote/', CreateVote.as_view(), name='create_view')
]嘗試POST請求
嘗試用POST新建一個問題。
用POST為這個問題添加選項。
細心的話可以發現,POST成功后,立馬返回了POST成功的數據。
項目代碼
目前為止的項目代碼可見于https://github.com/Runython/restify_django_tutorial/tree/b3
Step-last:后記
系列文章風格
系列文章會以低零基礎、手把手、逐行解釋、連續完整、資源指向的風格進行寫作。
低零基礎:降低文章閱讀門檻,使接觸Python Web開發時間較短的讀者也能有所收獲。
手把手:一些基礎操作,也會說明。如本文中,包括安裝庫等操作也會進行說明。
逐行解釋:對代碼進行解釋,以白居易寫詩風格為目標(傳說白居易會把自己的詩解釋給街頭婦人,直到連不懂文化的婦人也能明白,完成創作)。
連續完整:連續是指,文章是成系列的,上文下文之間是有著聯系的,項目是連續的。代碼托管也體現了這一點,不同的文章,對應不同的git標簽或分支,也體現了不同的進度。完整是指,項目是完整的,文章也是完整的。文章可以當作博文來讀,也可以當作教程來讀。
文章列表
Vue+Django構建前后端分離項目(選讀):
潤潤萬睡:Django+Vue.js構建項目?zhuanlan.zhihu.comPython構建RESTful網絡服務[Django篇:基于函數視圖的API]:
潤潤萬睡:Python構建RESTful網絡服務[Django篇:基于函數視圖的API]?zhuanlan.zhihu.comPython構建RESTful網絡服務[Django篇:使用PostgreSQL替代SQLite](選讀):
潤潤萬睡:Python構建RESTful網絡服務[Django篇:使用PostgreSQL替代SQLite]?zhuanlan.zhihu.comPython構建RESTful網絡服務[Django篇:基于類視圖的API]
潤潤萬睡:?zhuanlan.zhihu.com參考文獻
Hillar G C. Building RESTful Python Web Services[J]. Birmingham, UK: Packt Publishing Ltd, 2016.
總結
以上是生活随笔為你收集整理的as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面馆加盟多少钱啊?
- 下一篇: 类似《功夫足球》的影视剧是?