Django編寫RESTful API(三):基於類的檢視
歡迎訪問我的個人網站:www.comingnext.cn
前言
在上一篇文章中,主要講的是請求和響應,專案裡面views.py中的檢視函式都是基於函式的,並且我們介紹了@api_view這個很有用的裝飾器。同時,我們還介紹了APIView這個類,但是還沒使用它。在這篇文章中,我們要做的是把基於方法的檢視改為基於類的檢視,將會了解到APIView。
改為基於類的檢視
重構一下snippets/view.py:
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http importHttp404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status class SnippetList(APIView): """ 列出所有已經存在的snippet或者建立一個新的snippet """ def get(self, request, format=None): snippets = Snippet.objects.all() serializer= SnippetSerializer(snippets, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
到這裡應該很容易理解,和原來的相比,可以發現基於類的檢視把各種不同的HTTP請求分離開變成單個的方法,而不是if...elif...這樣的結構,所以這樣處理起來很更加的高效。
同樣的,把另一個檢視函式也進行修改:
class SnippetDetail(APIView): """ 檢索檢視、更新或者刪除一個snippet """ def get_object(self, pk): try: return Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: raise Http404 def get(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet) return Response(serializer.data) def put(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): snippet = self.get_object(pk) snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT)
改為基於類的檢視之後,當然也要修改一下路由了,對snippets/urls.py稍加修改:
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$', views.SnippetList.as_view()), url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns)
這樣就可以執行程式了,功能和之前的是一樣的
使用mixins類
使用基於類的檢視的好處除了上面所說的把各種HTTP請求分離開,還有什麼好處嗎?答案是肯定的——使用基於類的檢視的最大優勢之一是它可以輕鬆地構成可重複使用的行為。
可重複使用的行為?簡單說,就是讓我們少寫一點功能類似的程式碼,由此就要介紹一下mixins類了,它幫我們封裝了很多操作,簡化程式碼,使用也很簡單,編輯snippets/view.py函式:
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import mixins from rest_framework import generics class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
新的檢視類中繼承了 generic.GenericAPIView、mixins.ListModelMixin和mixins.CreatteModelMixin,類的作用看字面意思就能懂啦,mixins類為我們提供了list()和create()方法,當然,使用這兩個函式需要先設定queryset和serializer_class,這點我們檢視一下mixins的原始碼就可以看出來了,比如list方法:
class ListModelMixin(object): """ List a queryset. """ def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
這裡的程式碼會分別通過get_queryset()和get_serializer()得到查詢集和序列化器,其他封裝好的方法也是如此。
知道了這個,再修改一下另一個檢視類就很容易了:
class SnippetDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
使用通用的檢視類
到這裡,檢視程式碼已經簡化了許多了,但是我要告訴你的是,還可以進一步簡化。。。在此,讓我們一起在心中默唸:
人生苦短,我用Python
進一步簡化就是連mixins類都不用了,只使用generics就可以了,程式碼如下:
from snippets.models import Snippet from snippets.serializers import SnippetSerializer from rest_framework import generics class SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
好了,現在的程式碼就顯得非常簡潔了,但是短小卻精悍,依然可以實現原本的功能,隨意的展示一下:
把基於函式的檢視改成基於類的檢視就講到這裡了,下一篇文章會介紹授權和許可權~
相關推薦
Django編寫RESTful API(三):基於類的檢視
歡迎訪問我的個人網站:www.comingnext.cn 前言 在上一篇文章中,主要講的是請求和響應,專案裡面views.py中的檢視函式都是基於函式的,並且我們介紹了@api_view這個很有用的裝飾器。同時,我們還介紹了APIView這個類,但是還沒使用它。在這篇文章中
Django編寫RESTful API(二):請求和響應
歡迎訪問我的個人網站:www.comingnext.cn 前言 在上一篇文章,已經實現了訪問指定URL就返回了指定的資料,這也體現了RESTful API的一個理念,每一個URL代表著一個資源。當然我們還知道RESTful API的另一個特性就是,傳送不同的請求動作,會
ASP.NET Web API(三):安全驗證之使用摘要認證(digest authentication)
在前一篇文章中,主要討論了使用HTTP基本認證的方法,因為HTTP基本認證的方式決定了它在安全性方面存在很大的問題,所以接下來看看另一種驗證的方式:digest authentication,即摘要認證。 系列文章列表 摘要認證原理 在基本認證的方式中,主要的安全問題來自於使用者資訊的明文傳輸,而
HAProxy詳解(三):基於虛擬主機的HAProxy負載均衡系統配置實例【轉】
ise onf sysconf proxy配置 ffffff 規則設置 library 版本信息 論壇 一.基於虛擬主機的HAProxy負載均衡系統配置實例 1.通過HAProxy的ACL規則配置虛擬主機: 下面將通過HAProxy的AC
Spring Cloud Config(三):基於JDBC搭建配置中心
1、簡介 本文主要內容是基於jdbc搭建配置中心,使應用從配置中心讀取配置資訊併成功註冊到註冊中心,關於配置資訊表結構僅供參考,大家可以根據具體需要進行擴充套件。 2、Config Server 搭建 2.1、Maven 依賴 因為需要從資料庫讀取配置檔案,所以需要新增M
支援向量機SVM(三):基於核函式的非線性SVM
前言 線性分類SVM是一種線性分類非常有效的方法,若分類問題是非線性,需要考慮對資料進行 空間變換,將非線性分類問題轉變為線性分類問題,使非線性SVM的學習轉變為線性SVM的學習。 若使用對映ϕ\phiϕ將例項從原空間X\mathcal XX(一般為歐式空
猿題庫iOS客戶端的技術細節(三):基於CoreText的排版引擎
來自:http://blog.devtang.com/blog/2013/10/21/the-tech-detail-of-ape-client-3/ 前言 本人今年主要在負責猿題庫iOS客戶端的開發,本文旨在通過分享猿題庫iOS客戶端開發過程中的技術細節
Unity API(二):Input類
獲取鍵盤事件 Input.GetKey,某鍵被持續按下 Input.GetKeyDown,某鍵被按下 Input.GetkeyUp,某鍵被彈起 這些方法的引數是KeyCode型別,
列舉類(三):列舉類中幾個常用的方法
列舉類中的幾個常見方法 int compareTo(E o) String name() int ordinal() String toString() <T> T valueOf(Class<T> type,String name) values(
C#正則表示式程式設計(三):Match類和Group類用法
前面兩篇講述了正則表示式的基礎和一些簡單的例子,這篇將稍微深入一點探討一下正則表示式分組,在.NET中正則表示式分組是用Match類來代表的。首先先看一段程式碼:/// <summary> /// 顯示Match內多個Group的例子 /// </summa
Xbim.GLTF源碼解析(三):Builder類
site tar render bsp ets Once 處理 multipl stop IFC提取轉換成GLTF的邏輯在Builder類中, Builder.BuildInstancedScene():該函數包含主要的轉換邏輯,對應於我們在第二章中最後提出的轉換算
ASP.NET Core系列(三):啟動類Startup
前面講了ASP.NET Core 的專案結構,檢視完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144.html ASP.NET Core 裡面一個比較重要的就是Startup.cs 類,包括載入配置,
Django學習案例一(blog):三.模板Templates
內容 增加 doc -1 bsp cnblogs log -s ews 1.優化url配置 (1)上一節url配置用的是其中一種方式“Function views”,本節進行優化,用“Including another URLconf”方式。 Myblog/urls.p
API閘道器Kong(三):功能梳理和外掛使用-基本使用過程
作者: 李佶澳 轉載請保留:原文地址 釋出時間:2018-10-10 14:37:53 +0800 說明 Kong的Admin API Kong定義的資源之間的關聯關係
Docker系列(三):將.net core api部署到Kubernetes (K8s)中
1.新建一個WebApi專案,並新增Dockerfile檔案: FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WOR
ActiveMQ(三):ActiveMQ的安全機制、api及訂閱模式demo
一、ActiveMQ安全機制 ActiveMQ是使用jetty部署的,修改密碼需要到相應的配置檔案 配置檔案是這個: 在其第123行新增使用者名稱和密碼,新增配置如下: <plugins> <simpleAuthenti
爬蟲入門系列(三):用 requests 構建知乎 API
爬蟲入門系列目錄: 在爬蟲系列文章 優雅的HTTP庫requests 中介紹了 requests 的使用方式,這一次我們用 requests 構建一個知乎 API,功能包括:私信傳送、文章點贊、使用者關注等,因為任何涉及使用者操作的功能都需要登入後才操作,所以在閱讀這篇文章前建議先了解
SSM整合(三):編寫Service類和Dao
配置檔案寫完,應該填充專案的內容了。這裡的話,是準備做一個比較簡單的登入程式把SSM給整合了。step3:我們先理一下思路。1.建立person類來代表一個使用者(已做)2.建立一個LoginService介面3.實現一個LoginService介面4.建立一個PersonD
Hbase過濾器(三):附加過濾器API
目錄 一:跳轉過濾器(SkipFilter) 跳轉過濾器包裝了一個使用者提供的過濾器,當被包裝的過濾器遇到一個需要過濾的KeyValue例項時,使用者可以拓展並過濾到整行資料。換言之,當過濾器發現某一行中的一列被過濾時,那麼整行都會被過濾掉。案例將SkipFilter和Va
API 系列教程(三):使用 API Resource 來建立自定義 JSON 格式的 API
上一篇教程中我們通過 jwt-auth 實現了 Laravel 的 API 認證。 使用者請求登入介面 http://apidemo.test/api/auth/login 登入成功後,獲取到 JSON 響應,響應頭會帶有 token 資訊。 Authorizatio