Photo by Jan Piatkowski on Unsplash
現在,有許多的開發人員會使用許多的方式收集所需的資料,像是網頁爬蟲或網站平台,而擁有了這些有價值的資料後,有些時候會想要提供給大眾使用,進而創造出多元的應用,而最普遍就是透過API(Application Programming Interface)來提供服務。那該如何開發屬於自己的API服務呢?
Django tastypie套件,就是能夠讓開發人員使用Python,快速的建立RESTful API,非常簡潔且容易使用,所以本文將分享利用Django tastypie套件,來開發一個簡單的音樂歌曲清單API,藉此瞭解Python在Django框架中,建置API的實作過程,其中的重點包含:
- 簡介RESTful API
- 什麼是Django tastypie
- 安裝Django tastypie
- 建立API資源
- 測試API
- 建立API版本
- 設定API顯示欄位
- 限制API請求方法
一、簡介RESTful API
REST(Resource Representational State Transfer)是一個「軟體架構風格」,其中的核心概念是,將提供服務的一方稱為資源(Resource),並且利用HTTP傳輸協定的動詞(GET/POST/PUT/DELETE)來進行操作,而符合這種軟體架構風格的API,就稱為RESTful API,也因此RESTful API可以透過HTTP動詞及API網址,可以很直覺的知道會進行什麼樣的操作,簡單舉例如下:
- 查詢電影資料GET /movies
- 查詢電影資料GET /movies/1
- 新增電影資料POST /movies
- 修改電影資料PUT /movies
- 刪除電影資料DELETE /movies
二、什麼是Django tastypie
tastypie是Django框架的套件,支援Python3.4+及Django3.0,讓開發人員可以快速的在Django框架中,利用Python來開發RESTful API。
前往Django Packages,這邊類似Python的PyPI,擁有許多非常實用的Django套件,在右上角的地方輸入django-tastypie來進行查詢,如下圖:
前往Django Packages,這邊類似Python的PyPI,擁有許多非常實用的Django套件,在右上角的地方輸入django-tastypie來進行查詢,如下圖:
可以看到Django tastypie在2010年建立,並且擁有3636顆GitHub Stars,點擊套件名稱後,即可在右側看到GitHub Repo及參考文件,如下圖:
其中參考文件的地方,點擊後可以看到如下畫面:
接著選擇檢視文件,即可看到Django tastypie的完整使用方式。
三、安裝Django tastypie
和Python套件的安裝方法一樣,透過以下指令來安裝Django tastypie:
$ pip install django-tastypie
安裝成功後,開啟Django專案中的settings.py,在INSTALL_APPS應用程式串列中,增加tastypie,如下範例:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'musics.apps.MusicsConfig',
'tastypie',
]
由於Django tastypie套件也有它自己的資料模型,所以需要利用以下指令執行Migration(資料遷移):
$ python manage.py migrate
這時候前往Django Administration(管理員後台),即可看到Django tastypie的資料模型,如下圖:
四、建立API資源
接下來,就要建立API的資源(Resource),也就是提供API服務的Django應用程式(APP)資料模型,而本文所使用的資料模型(models.py)如下範例:
from django.db import models
class Music(models.Model):
name = models.CharField(max_length=50) # 歌曲名稱
artist = models.CharField(max_length=50) # 歌手
album = models.CharField(max_length=50) # 專輯
release_date = models.DateField() # 發行日期
有了資料模型後,在Django應用程式(APP)下,建立resources.py檔案,如下圖:
在resources.py檔案中,引用Django tastypie的ModelResource類別及應用程式的資料模型,來建立API資源類別,如下範例:
from tastypie.resources import ModelResource
from .models import Music
class MusicResource(ModelResource):
class Meta:
queryset = Music.objects.all()
resource_name = 'music'
music_resource = MusicResource() #建立API資源
其中的queryset為此API資源(Resource)的資料集,範例中為查詢Music資料模型中的資料,而resource_name則為此API資源的名稱。最後,建立API資源物件。
接著,開啟Django專案中的urls.py,來設定這個API資源(Resource)的網址,如下範例:
接著,開啟Django專案中的urls.py,來設定這個API資源(Resource)的網址,如下範例:
from django.contrib import admin
from django.urls import path, include
from musics.resources import music_resource
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(music_resource.urls))
]
這邊要特別注意的地方是,第7行的API的網址必須以「api」開頭,之後的music_resource.urls則會自動帶出在resources.py中,所設定的resource_name,也就是說,存取API的網址為/api/music/。
五、測試API
API開發完成,並且設定好網址後,就可以進行API的測試,首先,利用以下的指令啟動本地端伺服器:
$ python manage.py runserver
而測試的方式除了在瀏覽器中,輸入API網址(http://127.0.0.1:8000/api/music/)來查看執行結果外,這邊教大家另外一個實用的方法。
在Visual Studio Code中,安裝REST Client擴充套件,如下圖:
在Visual Studio Code中,安裝REST Client擴充套件,如下圖:
安裝完成後,在Django專案中,新增一個doc.http的檔案,接著在裡面輸入API的網址,如下範例:
由於此API是提供查詢的服務,所以利用HTTP的GET方法來進行請求。在輸入API網址後,上方會自動出現Send Request按鈕,點擊後,就會發送請求至API端點(endpoint),並且會在Visual Studio Code的右方,出現API回傳的結果,如下圖:
使用這個方式測試的好處是,可以在doc.http檔案中,輸入多個API端點(endpoint)來進行測試,提升API測試的效率。
六、建立API版本
在實務上開發API時,常常會因為需求的改變而修改API的傳入參數或回傳結果,所以通常會建立API的版本,讓原來的使用者不會因為API的修改後,而產生錯誤。而Django tastypie套件也提供了此功能。
開啟Django專案的urls.py,建立tastypie的Api物件,其中需利用Python關鍵字參數(Keyword Argument)設定api_name,接著,再將API資源加入到Api物件中,最後,傳入至path()函式中,如下範例:
開啟Django專案的urls.py,建立tastypie的Api物件,其中需利用Python關鍵字參數(Keyword Argument)設定api_name,接著,再將API資源加入到Api物件中,最後,傳入至path()函式中,如下範例:
from django.contrib import admin
from django.urls import path, include
from musics.resources import music_resource
from tastypie.api import Api
v1_api = Api(api_name='v1')
v1_api.register(music_resource)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(v1_api.urls))
]
這時候,請求原來的API網址(http://127.0.0.1:8000/api/music/)時,會出現404 Not Found的回傳訊息,如下圖:
因為在API網址中,又增加了一層api_name,也就是API版本(v1),所以,網址需修改為(http://127.0.0.1:8000/api/v1/music/),就會回傳正確的執行結果了。
七、設定API顯示欄位
如果想要客製化API回傳結果的顯示欄位,可以在resources.py檔案中,利用fields屬性來進行設定,如下範例:
from tastypie.resources import ModelResource
from .models import Music
class MusicResource(ModelResource):
class Meta:
queryset = Music.objects.all()
resource_name = 'music'
fields = ['name', 'artist'] #設定顯示欄位
music_resource = MusicResource()
執行結果八、限制API請求方法
提供API服務給其它使用者時,有時為了安全的考量,會限制HTTP請求的方式,防止使用者透過不如預期的HTTP請求方式存取,這時候就可以在resources.py檔案中,利用allowed_methods屬性來進行設定,如下範例:
from tastypie.resources import ModelResource
from .models import Music
class MusicResource(ModelResource):
class Meta:
queryset = Music.objects.all()
resource_name = 'music'
fields = ['name', 'artist']
allowed_methods = ['get']
music_resource = MusicResource()
當使用HTTP的POST進行API請求時,就會回傳405 Method Not Allowed的訊息,如下圖:
最後,可以參考[Django教學11]Django部署到Heroku雲端平台教學指南文章,將API部署到Heroku雲端平台上,就可以讓其它使用者可以進行存取使用囉。
九、小結
以上就是在Django框架中,利用tastypie套件來開發API的實作過程,希望套過此篇教學,除了瞭解基本的RESTful API的概念外,也能夠使用Python來開發出屬於自己的API,提供服務給其它人使用。詳細的實作歷程,可以參考下方的GitHub網址。如果在實作的過程中有碰到任何問題,或是有使用Django tastypie來開發API經驗的朋友,歡迎留言和我分享唷。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
GitHub網址:https://github.com/mikeku1116/django-tastypie-package
有想要看的教學內容嗎?歡迎利用以下的Google表單讓我知道,將有機會成為教學文章,分享給大家😊
你可能有興趣的文章
- Python學習資源整理
- [Django教學1]3步驟快速安裝Django網站框架
- [Django教學8]Django UserCreationForm實作網站登入驗證及註冊功能分享
- [Django教學9]6個步驟搞懂Django上傳圖片的功能
- [Django教學11]Django部署到Heroku雲端平台教學指南
- [Python實戰應用]淺談Python Selenium網站自動化套件
- [Python實戰應用]瞭解Python存取API的重要觀念-以KKBOX Open API為例
- [Python物件導向]解析Python物件導向設計的3種類型方法(Instance,Class,Static Method)
- 5個必知的Python Function觀念整理
非常棒
回覆刪除