1. 程式人生 > >第 4 篇:用類檢視實現首頁 API

第 4 篇:用類檢視實現首頁 API

![](https://img2020.cnblogs.com/blog/759200/202004/759200-20200415161158343-1662112908.jpg) 作者:[HelloGitHub-追夢人物](https://www.zmrenwu.com) > 文中所涉及的示例程式碼,已同步更新到 [HelloGitHub-Team 倉庫](https://github.com/HelloGitHub-Team/HelloDjango-REST-framework-tutorial) django-rest-framework 類檢視拓展自 django 的類檢視,只是針對資料的序列化和反序列化等邏輯做了封裝。 django-rest-framework 中最基本的類檢視是 `views.APIView`,這個類可以看成是上一篇教程中用到的 api_view 裝飾器的類版本。這個類比較基礎,其核心功能就是 HTTP 請求預處理、分發請求給對應的處理函式,以及 HTTP 響應後處理,還有就是 `as_view` 方法將類轉為函式(要注意與被請求的 URL 繫結的檢視必須是一個可呼叫物件,普通的的類是無法被直接呼叫的)。除非需要深度定製檢視函式的邏輯,一般情況下我們的檢視不會直接繼承這個類。 更為通用的類檢視是 `GenericAPIView`,這個類繼承自 `APIView`,對基類的功能做了拓展。繼承自這個類的檢視,只需對其類屬性做一些簡單的配置,就能獲得獲取單個資源、獲取資源列表、資源列表分頁等功能。當然,這個類作為其他特定功能類檢視的基類,我們一般也很少使用。 回顧一下此前講的 RESTful 架構的基本概念,客戶端使用 URL 訪問資源,通過 HTTP 請求的動詞表達對資源的操作。django-rest-framework 針對各種型別的資源操作,提供了對應的通用類檢視,這些通用類檢視主要包括: - **CreateAPIView** 用於建立資源的 POST 請求。 - **ListAPIView** 和 **RetrieveAPIView** 用於訪問資源列表和單個資源的 GET 請求。 - **DestroyAPIView** 用於刪除資源的 DELETE 請求。 - **UpdateAPIView** 用於更新資源的 PUT(全量更新)和 PATCH(部分更新)請求。 以及以上檢視的各種組合通用類檢視:`ListCreateAPIView`、`RetrieveUpdateAPIView`、`RetrieveDestroyAPIView`、`RetrieveUpdateDestroyAPIView`。 部落格首頁 API 返回首頁文章列表資料,顯然應該選用的是 `ListAPIView`。其程式碼如下: ```python from rest_framework.generics import ListAPIView from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import AllowAny class IndexPostListAPIView(ListAPIView): serializer_class = PostListSerializer queryset = Post.objects.all() pagination_class = PageNumberPagination permission_classes = [AllowAny] ``` That all!首頁 API 就寫好了。我們基本沒有寫任何邏輯程式碼,只是指定了類檢視的幾個屬性值。因為邏輯基本都是通用的,通用類檢視在背後幫我們做了全部工作,我們只要告訴它:用哪個序列化器去做,序列化哪個資源等就可以了。以這裡的類檢視為例,我們指定了: 使用 `PostListSerializer` 序列化器(通過 `serializer_class` 指定); 序列化部落格文章(Post)列表(通過 `queryset` 指定); 對資源列表分頁(通過 `pagination_class` 指定,`PageNumberPagination` 會自動對資源進行分頁,後面的教程會詳細介紹分頁功能); 允許任何人訪問該資源(通過 `permission_classes` 指定,`AllowAny` 許可權類不對任何訪問做攔截,即允許任何人呼叫這個 API 以訪問其資源)。 最後一步就是在 urls.py 中繫結介面,把原來繫結的函式檢視改為現在的類檢視: ```python path('api/index/', views.IndexPostListAPIView.as_view()) ``` 啟動開發伺服器,開啟瀏覽器訪問 http://127.0.0.1:8000/api/index/,可以看到和上一篇教程中使用函式檢視返回的結果是一樣的: ```json { "count": 201, "next": "http://127.0.0.1:10000/api/index/?page=2", "previous": null, "results": [ { "id": 1, "title": "Markdown 與程式碼高亮測試", "created_time": "2020-04-23T14:22:36.129383+08:00", "excerpt": "歡迎使用馬克飛象\n@(示例筆記本)[馬克飛象|幫助|Markdown]\n馬克飛象是一款專為印象筆記(Ever", "category": { "id": 6, "name": "Markdown測試" }, "author": { "id": 1, "username": "admin" }, "views": 0 } ] } ``` 而且可以看到,返回的結果進行了分頁,next 欄位指示了下一頁的連結,這樣分頁訪問資源就變的非常方便了。 --- ![](https://img2018.cnblogs.com/blog/759200/202002/759200-20200213201956024-782757549.png) **關注公眾號加入交流群**