iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0

上次我們講了 Flask 的 Route,知道可以透過

@app.route()

設定不同的 Path,讓 Request(請求)來到不同的 Path 時,執行不同的程式。
像上一篇寫的:

@app.route('/tasks')
def tasks():
    return "My Tasks"

如果請求來到 /tasks,就執行下面程式,然後回傳 My Tasks
我們現在範例的回傳都只是一段文字。
如果今天要做一個作業 API,我們想要回傳作業的資料,可能會希望長這樣:
作業名稱:Flask
是否完成:否
這時候就不能只回傳一句 My Tasks 了,而是需要把資料整理好再傳出去。
而在 Web API 中,很常使用的一種資料格式就是 JSON。

JSON 是什麼?

JSON = JavaScript Object Notation。
它是一種常用來交換資料的格式。
名字裡雖然有 JavaScript,但現在幾乎每種語言都支援它,所以並不是 JavaScript 專用的。
例如一筆作業資料可以寫成:

{
  "name": "Flask",
  "completed": false
}

可以像這樣,用「名稱和值」的方式把資料整理起來,讓資料更有結構一點,也方便知道每個資料代表什麼

像是這段就在說
name → 作業名稱
completed → 是否完成

JSON 看起來和 Python 的字典很像,但它們不是同一個東西。

幾個常見的差別:

Python 的 True / False → JSON 是 true / false(小寫)
Python 的 None → JSON 是 null
JSON 的名稱和文字一定要用雙引號 ” ,不能用單引號 ’

那 Flask 要怎麼回傳這種資料?

我們繼續沿用上一篇程式
把 tasks() 的回傳值修改成 Python 的字典:

@app.route('/tasks')
def tasks():
    return {
        "name": "Flask",
        "completed": False
    }

儲存程式
並打開 http://127.0.0.1:5000/tasks

當 Request 來到 /tasks 時,Flask 會找到 /tasks 對應的 Route,執行 tasks()。
而這次 tasks() 回傳的不是 “My Tasks”,而是一個 Python 字典。
Flask 收到這個字典後,會自動把它轉成 JSON 格式,放進 HTTP Response,再回傳給瀏覽器。

Request 來到 /tasks
        ↓
Flask 找到 /tasks 對應的 Route
        ↓
執行 tasks()
        ↓
return Python 字典
        ↓
Flask 轉成 JSON
        ↓
放進 HTTP Response
        ↓
回傳給瀏覽器

回傳的資料:
https://ithelp.ithome.com.tw/upload/images/20260923/201838650pZQmgXAtF.png
瀏覽器打開 http://127.0.0.1:5000/tasks 看到 JSON 的畫面

這裡可以注意一個地方:
我們在 Python 裡寫的是 False,但瀏覽器上顯示的是 false。
因為 Flask 已經把 Python 字典轉成 JSON 了,這就是剛剛說的那個差別。

真的是 JSON 嗎?

光看畫面,其實不太容易確定它跟一般的文字有什麼不同。

有兩個方式可以確認。

第一個是在瀏覽器按 F12 打開開發者工具,切到 Network,重新整理頁面,再點一下 tasks 這筆請求,
在 Response Headers 裡面就會看到。
https://ithelp.ithome.com.tw/upload/images/20260923/20183865VXM2jEJn8K.png

第二個更直接,在終端機下:

curl.exe -i http://127.0.0.1:5000/tasks

i 的意思是「連 Header 一起印出來」。

會看到:
https://ithelp.ithome.com.tw/upload/images/20260923/20183865Z8OaJ10MGt.png
重點是中間這一行:
Content-Type: application/json
用 curl -i 看 Response,Content-Type 是 application/json
Day 3 有提到,Response 是後端回傳的結果。

這裡就可以實際看到,Flask 除了把資料傳回來之外,也在 Response 裡標示了「我這次回傳的是 JSON」,
前端收到之後才知道要用什麼方式處理這包資料。
(如果回傳的是 “My Tasks” 這種字串,這裡會變成 text/html。)

那如果想回傳很多筆呢?

除了字典之外,也可以直接回傳 List:

@app.route('/tasks')
def tasks():
    return [
        {"name": "Flask", "completed": False},
        {"name": "JSON", "completed": True},
    ]

Flask 一樣會幫我們轉成 JSON,只是這次變成一個陣列。

https://ithelp.ithome.com.tw/upload/images/20260923/20183865gh2SUAW2Hn.png
回傳 List 時,瀏覽器看到的 JSON 陣列

(回傳 List 是 Flask 2.2 之後才支援的,如果看到比較舊的教學說不行,是版本的關係。)

也就是說,我們在 Python 裡寫的是 Python 字典,Flask 會幫我們轉成 JSON,再透過前面學過的 Response 把資料傳出去。

今天我們不再只讓 Flask 回傳一句簡單的文字,而是開始讓它回傳比較有結構的資料。

我們先在 Python 中使用字典整理資料,再交給 Flask 轉成 JSON,最後透過 HTTP Response 回傳。

這也把前面學過的 Request 和 Response 實際串進 Flask:

Request 進來 → Flask 處理 → Response 回去

現在我們已經知道 Flask 可以怎麼回傳資料了。

不過接下來如果要開始建立更多 API,還有沒有其他工具可以讓我們寫 API 更方便呢?

下一篇就來看看 Flask 開發 API 時有哪些常見的套件。


上一篇
Day 8|Flask Route 是什麼?
下一篇
Day10 | Flask 開發 API 還有哪些套件?
系列文
從零開始的後端開發:用 Flask 實作 REST API,搞懂 API 與資料庫之間如何協作 共 15 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言