利用 Django REST framework 構建 RESTful Web API
終于到了動手操作的環節啦,這一節,我們以師生管理系統為例,帶領大家搭建一套 framework Web API?!肮び破涫拢叵壤淦鳌?,我們選用當下最為流行的 Django REST framework 為工具,快速實現這套API。
安裝 Django REST framework 需要以下依賴:
- Python (3.5, 3.6, 3.7, 3.8)
- Django (1.11, 2.0, 2.1, 2.2, 3.0)
Django REST framework是以 Django 擴展應用的方式提供的,所以我們可以直接利用已有的Django環境而無需重新創建。(若沒有Django環境,需要先創建環境安裝Django)
1. 安裝 Django REST framework
pip install django
pip install djangorestframework
django 安裝過程:
django-rest-framework 安裝過程:
2.創建工程和應用
django-admin startproject ProjectDemo
django-admin startapp AppDemo
工程和應用創建完成后,目錄結構如下圖所示:
3. 注冊rest_framework應用
Django REST framework 可視作是 Django 的一個應用,在使用之前,需要在 settings.py 的 INSTALLED_APPS 中注冊。
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
在完成以上操作后,就可以使用 Django REST framework 開發 Restful Web API 了。接下來,我們將以學生管理系統為例,帶大家一覽 Django REST framework 如何高效開發 REST API。
4.創建、遷移模型,并添加數據
構建數據模型,是搭建 Restful Web API 的基礎。構建模型,相當于構建數據庫結構,且無需繁瑣的 SQL 語言,另一個好處是,即使切換不同的數據庫引擎(mysql 、SQL Server、Oracle等),也無需重新構建。下方我們構建一個學生信息表,包含學生姓名、學生年齡和學號。
# models.py
from django.db import models
class StudentsInfo(models.Model):
'''
學生信息模型
'''
# 以下為學生信息表中的各個字段,CharField、IntegerField聲明了字段類型分別為字符串類型和整型,max_length規定了字段最大長度,verbose_name相當于給字段取了一個別名,將來在管理頁面會顯示這個別名,否則顯示字段名。例如,如果設置了verbose_name,那么在管理頁面中,s_name字段將一“學生姓名”顯示出來,如果沒有設置verbose_name,則直接顯示“s_name”。verbose_name只是方便用戶以后的使用,設置與否不影響內部數據的存儲。
s_name = models.CharField(max_length=8, verbose_name='學生姓名')
s_age = models.IntegerField(verbose_name='學生年齡')
s_number = models.CharField(max_length=16, verbose_name='學號')
終端中運行命令以遷移模型
python manage.py makemigrations
python migrate
向數據庫中添加演示數據,這里我們可以使用 PyCharm 自帶的 Database 工具來完成。由于我們使用的是sqlite3 作為數據庫,添加數據時,可雙擊左側文件目錄中的 db.sqlite3 文件,而后在右側 Database 工具中雙擊要操作的數據表(AppDemo_studentsmodel)。
在打開的數據表中,填入要填充的數據即可:
5. 創建序列化器
通常,API 包含兩個方向的操作,其一是客戶端向服務器請求數據,其二是客戶端向服務器提交數據。當客戶端向服務器請求數據時,服務器在數據庫檢索相應數據,經過序列化器序列化,再由視圖交給客戶端;客戶端向服務器提交數據時,數據經由視圖層進行處理,而后序列化器反序列化,最后存入數據庫。
在 Restful Web API 中,序列化器相當于客戶端和數據庫之間數據對接的橋梁,它可將服務器中的數據,序列化為客戶端可解析的數據形式,相反,也可將客戶端提供的數據,反序列化為符合數據庫要求的數據形式。接下來,我們在 AppDemo 應用中新建 serializers.py 用于保存該應用的序列化器。
創建一個 StudentsSerializer 用于序列化與反序列化學生信息:
# serializers.py
from rest_framework import serializers
from AppDemo.models import StudentsModel
class StudentsSerializer(serializers.ModelSerializer):
class Meta:
# 對StudentsModel進行序列化
model = StudentsModel
# __all__表示對 StudentsModel 中所有字段序列化進行序列化
fields = '__all__'
- model :指明該序列化器處理的數據字段從模型類 StudentsModel 參考生成;
- fields :指明該序列化器包含模型類中的哪些字段,'all’指明包含所有字段。
5. 編寫視圖
在 Restful Web API 中,視圖扮演的角色是數據處理器。例如,客戶端需要獲取一個學生一次期末考試后各科成績的平均值,而數據庫中僅存了各科的成績,這時,就需要視圖對數據處理,根據各科成績求出平均值后返回給客戶端。由于本案例無需對數據進行處理,視圖實現較為簡單。在 booktest 應用的 views.py 中創建視圖 BookInfoViewSet,這是一個視圖集合。
# views.py
from rest_framework import viewsets
from AppDemo.models import StudentsModel
from AppDemo.serializers import StudentsSerializer
class StudentsViewSet(viewsets.ModelViewSet):
queryset = StudentsModel.objects.all()
# 使用上一步創建的StudentsSerializer對模型進行序列化
serializer_class = StudentsSerializer
- queryset 指明該視圖集在查詢數據時使用的查詢集;
- serializer_class 指明該視圖在進行序列化或反序列化時使用的序列化器。
6. 定義路由
路由是用來定義 RESTful Web API 不同接口所對應的不同路徑地址。在本案例中,我們是要獲得學生的信息,根據第 3 節中介紹的設計規范,地址應設計為:http://www.demo.com/api/students 。在 ProjectDemo 的 urls.py 中定義路由信息。
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from AppDemo.views import StudentsViewSet
router = routers.DefaultRouter() # 創建路由器
router.register(r'students', StudentsViewSet) # 在路由器中注冊視圖集路由地址
urlpatterns = [
# 拼接路由路徑
path('api/', include(router.urls)),
]
8. 運行測試
終端中運行當前程序(與運行 Django 一樣):
python manage.py runserver
此時,我們的 RESTful Web API 已構建完畢。由于我們是在本地測試,所以 API 域名部分采用本機地址。在瀏覽器地址欄輸入 http://127.0.0.1:8000/api,即可看到當前項目中所有接口連接。
點擊鏈接 http://127.0.0.1:8000/api/students/ 即可前往學生信息接口,可以獲取所有學生的信息,如下圖所示:
在頁面底部的表單中,我們可以輸入學生信息,點擊 POST 按鈕,即可實現向學生列表中添加新的學生信息:
點擊 POST 按鈕后,返回如下信息:
此時再點擊 GET 按鈕,我們發現上一步中添加的學生(小白)已經顯示在所有學生信息中。
在瀏覽器中輸入網址 127.0.0.1:8000/api/students/2/,可以訪問獲取單個學生信息的接口(id 為 2 的學生),如下圖所示:
如果需要修改該學生的信息,可在頁面底部表單中填寫需要修改的信息,即可訪問修改單個學生的接口。我們將小紅年齡修改為 20:
點擊 PUT,返回如下頁面信息,此時小紅的年齡信息已經修改完畢:
點擊 DELETE 按鈕,可以訪問刪除學生的接口:
點 DELETE 后返回,如下頁面,此時 id 為 2 的學生小紅已被刪除:
9.小結
本節主要講解了 Django 和 Django REST framework 安裝方法,并利用 Django REST framework 實現了一個簡單的學生管理系統 RESTful Web API。至此,一個符合 RESTful 規范的簡單 API 就創建完成了。除此之外,Django REST framework 還為我們提供了許多高級功能,我們將在后續小節為大家詳細介紹。