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