1、明確REST接口開發的核心任務
分析一下上節的案例,能夠發現,在開發REST API接口時,視圖中作的最主要有三件事:php
- 將請求的數據(如JSON格式)轉換爲模型類對象
- 操做數據庫
- 將模型類對象轉換爲響應的數據(如JSON格式)
1.1 序列化Serialization
維基百科中對於序列化的定義:前端
序列化(serialization)在計算機科學的資料處理中,是指將數據結構或物件狀態轉換成可取用格式(例如存成檔案,存於緩衝,或經由網絡中傳送),以留待後續在相同或另外一臺計算機環境中,能恢復原先狀態的過程。依照序列化格式從新獲取字節的結果時,能夠利用它來產生與原始物件相同語義的副本。對於許多物件,像是使用大量參照的複雜物件,這種序列化重建的過程並不容易。面向對象中的物件序列化,並不歸納以前原始物件所關聯的函式。這種過程也稱爲物件編組(marshalling)。從一系列字節提取數據結構的反向操做,是反序列化(也稱爲解編組, deserialization, unmarshalling)。python
序列化在計算機科學中一般有如下定義:git
在數據儲存與傳送的部分是指將一個對象存儲至一個儲存媒介,例如檔案或是記億體緩衝等,或者透過網絡傳送資料時進行編碼的過程,能夠是字節或是XML等格式。而字節的或XML編碼格式能夠還原徹底相等的對象。這程序被應用在不一樣應用程序之間傳送對象,以及服務器將對象儲存到檔案或數據庫。相反的過程又稱爲反序列化。github
簡而言之,咱們能夠將序列化理解爲:web
將程序中的一個數據結構類型轉換爲其餘格式(字典、JSON、XML等),例如將Django中的模型類對象裝換爲JSON字符串,這個轉換過程咱們稱爲序列化。數據庫
如:django
queryset = BookInfo.objects.all() book_list = [] # 序列化 for book in queryset: book_list.append({ 'id': book.id, 'btitle': book.btitle, 'bpub_date': book.bpub_date, 'bread': book.bread, 'bcomment': book.bcomment, 'image': book.image.url if book.image else '' }) return JsonResponse(book_list, safe=False)
反之,將其餘格式(字典、JSON、XML等)轉換爲程序中的數據,例如將JSON字符串轉換爲Django中的模型類對象,這個過程咱們稱爲反序列化。json
如:服務器
json_bytes = request.body json_str = json_bytes.decode() # 反序列化 book_dict = json.loads(json_str) book = BookInfo.objects.create( btitle=book_dict.get('btitle'), bpub_date=datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date() )
咱們能夠看到,在開發REST API時,視圖中要頻繁的進行序列化與反序列化的編寫。
1.2 總結
在開發REST API接口時,咱們在視圖中須要作的最核心的事是:
- 將數據庫數據序列化爲前端所須要的格式,並返回;
- 將前端發送的數據反序列化爲模型類對象,並保存到數據庫中。
2、Django REST framework 簡介
- 在序列化與反序列化時,雖然操做的數據不盡相同,可是執行的過程倒是類似的,也就是說這部分代碼是能夠複用簡化編寫的。
- 在開發REST API的視圖中,雖然每一個視圖具體操做的數據不一樣,但增、刪、改、查的實現流程基本套路化,因此這部分代碼也是能夠複用簡化編寫的:
- 增:校驗請求數據 -> 執行反序列化過程 -> 保存數據庫 -> 將保存的對象序列化並返回
- 刪:判斷要刪除的數據是否存在 -> 執行數據庫刪除
- 改:判斷要修改的數據是否存在 -> 校驗請求的數據 -> 執行反序列化過程 -> 保存數據庫 -> 將保存的對象序列化並返回
- 查:查詢數據庫 -> 將數據序列化並返回
Django REST framework能夠幫助咱們簡化上述兩部分的代碼編寫,大大提升REST API的開發速度。
認識Django REST framework
Django REST framework 框架是一個用於構建Web API 的強大而又靈活的工具。
一般簡稱爲DRF框架 或 REST framework。
DRF框架是創建在Django框架基礎之上,由Tom Christie大牛二次開發的開源項目。
特色
- 提供了定義序列化器Serializer的方法,能夠快速根據 Django ORM 或者其它庫自動序列化/反序列化;
- 提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;
- 豐富的定製層級:函數視圖、類視圖、視圖集合到自動生成 API,知足各類須要;
- 多種身份認證和權限認證方式的支持;
- 內置了限流系統;
- 直觀的 API web 界面;
- 可擴展性,插件豐富
資料: