博客 / 詳情

返回

利用Django REST framework構建RESTful Web API

本文首發自「慕課網」,想了解更多IT乾貨內容,程序員圈內熱聞,歡迎關注"慕課網"及“慕課網公眾號”!

作者:ExcellentDavid | 慕課網講師


這次,我們以師生管理系統為例,帶領大家搭建一套 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.pyINSTALLED\_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 就創建完成了。


歡迎關注「慕課網」官方帳號,我們會一直堅持提供IT圈優質內容,分享乾貨知識,大家一起共同成長吧!

本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.