iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Software Development

從開始到放棄的Flask系列 第 29

[Day 29] 使用 Flask-RESTx 創建 RESTful API(3)

  • 分享至 

  • xImage
  •  

前幾天有介紹了API及什麼是RESTful API了,也有簡單的介紹可以怎麼使用他,那今天這篇文章將介紹 Flask-RESTxFlask-RESTx是一個強大的 Flask 擴展,他可以幫助我們快速並且輕鬆地創建 RESTful APIFlask-RESTx 提供了豐富的功能集,包括自動文檔生成、請求驗證、自定義錯誤處理等等好用的功能。此外,我們還將瞭解如何將 Swagger 整合到我們的 Flask-RESTx 項目中,以自動生成詳細的 API 文檔並提供互動式測試功能。

安裝和設定環境

在開始創建 RESTful API 之前,我們一樣首先需要確保我們的開發環境已經配置正確。這包括安裝必要的套件和設定我們的 Flask 應用程序。

  1. 安裝 Flask-RESTx 和相關套件
    我們將使用 Flask-RESTx 來簡化 RESTful API 的開發。使用以下命令來安裝 Flask-RESTx:
pip install Flask-RESTx
  1. 創建 Flask 應用
from flask import Flask
from flask_restx import Api

app = Flask(__name__)
api = Api(app)

if __name__ == '__main__':
    app.run(debug=True)

上面的程式創建了一個 Flask 應用程序,並初始化了 Flask-RESTx,我們將在其中定義 API 資源和路由。

  1. 設定路由
    接下來我們就可以開始定義我們的 API 資源和路由了。首先我們將創建一個簡單的命名空間(Namespace),用於組織我們的 API 端點。以下是一個示例:
# 引入需要的套件
from flask_restx import Namespace, Resource

test = Namespace("test", description='鐵人賽D29')

# 定義 RESTful 資源
@test.route("/hello")
class HelloWorld(Resource):
    def get(self):
        return {'message': 'Hello, World!'}
# 將命名空間加入 API
api.add_namespace(test, '/test')

這個示例中,我們創建了一個名為 "test" 的命名空間,並定義了一個名為 "HelloWorld" 的 RESTful 資源,其中包含一個 GET 方法,用於返回一條簡單的歡迎消息。
接著我們將程式啟動看看,就能看到我們第一個API了喔。
https://ithelp.ithome.com.tw/upload/images/20231009/20159225sDfLjjwRGe.png
接著我們測試這個API,點她的try it out,接著點Execute就可以看到這個畫面了
https://ithelp.ithome.com.tw/upload/images/20231009/20159225zHtMOGv3CO.png
這樣代表我們成功執行了喔!!

定義 Flask-RESTx 資源

我們已經創建了一個基本的 Flask 應用程序並初始化了 Flask-RESTx,接著來看看如何定義資源和處理 RESTful 方法。

  • 資源和命名空間(Namespace)
    在 Flask-RESTx 中,API 資源通常組織在命名空間(Namespace)下,以幫助組織和分類相關的端點。在前面的示例中,我們已經創建了一個名為 "test" 的命名空間,並將一個 RESTful 資源 "HelloWorld" 關聯到該命名空間。

命名空間允許我們定義相關的 API 資源,並為這些資源指定一個統一的前綴路徑。這使得 API 更容易管理和擴展。

  • 模型(Model)
    定義模型(Model)是一個重要的功能,它允許我們明確指定 API 中數據的結構和驗證規則。
    下面我透過簡單的範例來示範
from flask import Flask
from flask_restx import Namespace, Resource, fields, Api

# 創建 Flask 應用
app = Flask(__name__)
api = Api(app)

# 定義命名空間
test_ns = Namespace("test", description='鐵人賽D29')

# 定義一個模型
input_model = api.model('InputModel', {
    'name': fields.String(required=True, description='User name'),
})

# 定義一個資源
@test_ns.route('/hello')
class HelloResource(Resource):
    @test_ns.expect(input_model, validate=True)  # 使用模型定義預期的輸入
    def post(self):
        data = test_ns.payload  # 自動解析並驗證請求數據
        name = data['name']
        return {'message': f'Hello, {name}!'}

# 將命名空間加入 API
api.add_namespace(test_ns, '/test')

if __name__ == '__main__':
    app.run(debug=True)

接著來看看程式碼的各個部分說明:

  1. 首先創建了一個 Flask 應用和一個 Flask-RESTx 的 API 實例。
  2. 定義了一個命名空間(Namespace) test_ns,用來組織和管理 API 資源。這個命名空間的描述是 '鐵人賽D29'
  3. 使用 api.model 方法定義了一個模型(Model) InputModel,該模型描述了一個帶有 name 字段的數據結構。required=True 表示 name 字段是必需的。
  4. @test_ns.route('/hello') 中,我們定義了一個資源 HelloResource,該資源具有一個 POST 請求方法。
  5. HelloResource 的 POST 方法中,我們使用 @test_ns.expect(input_model, validate=True) 裝飾器來指定模型 input_model,這表示我們期望請求的輸入數據應該符合這個模型的結構,並且要進行驗證。
  6. 在 POST 方法中,解析請求數據,並從中獲取 name 字段的值。然後使用這個值來構建一個歡迎消息,最後將該消息作為 JSON 響應返回。
  7. 最後將命名空間 test_ns 添加到 API 中,並指定路由前綴為 /test。

接下來實際看看操作的畫面吧,一樣原神,啟動!
一進來可以先看到比原本的程式多了一個叫做Models的選項,點開可以看到剛剛的描述解釋都在這裡了
https://ithelp.ithome.com.tw/upload/images/20231009/20159225BC1bxPfwZN.png
接著回到上面的API部分,我們一樣點開Try it out,並且在payload部分寫上名字
https://ithelp.ithome.com.tw/upload/images/20231009/20159225FZRjdDgifU.png
接著執行他
https://ithelp.ithome.com.tw/upload/images/20231009/20159225pQUfK2EOxf.png
就可以看到我們成功執行啦~~這個程式碼示範了如何使用 Flask-RESTx 創建一個具有數據驗證的簡單 API,該 API 接受 POST 請求,並根據請求中的數據返回歡迎消息。
今天就到這邊了,如果有興趣的朋友可以繼續往下研究!


上一篇
[Day 28]Flask RESTful API(2)
下一篇
[Day 30]從開始到放棄的Flask 完賽囉
系列文
從開始到放棄的Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言