如何在 Ubuntu 上使用 Flask 创建 REST API

引言

本教程將教您如何使用輕量级的Python網頁框架Flask創建一個簡單的REST API。我們將涵蓋設定Flask應用程式的基本知識、定義路徑、處理請求以及返回JSON响应。在本次教程結束時,您將有一個可以擴展並與其他應用程式集成的運作中的API。

前置知識

  • 一台運行Ubuntu的伺服器,以及具有sudo權限的非root用戶和一個活躍的防火牆。如需設置指引,請從此列表中選擇您的 distributions,並遵循我們的初始伺服器設定指南。請確保使用受支持的Ubuntu版本
  • 熟悉 Linux 命令行。若要學習命令行的基礎或重温,您可以查看這份Linux 命令行简介指南。

  • 對 Python 程式設計有基本認識。

  • 您的 Ubuntu 系統上必須安装 Python 3.7 或更高版本。欲了解如何在 Ubuntu 上運行 Python 腳本,請參考我們關於如何在 Ubuntu 上運行 Python 腳本的教程。

步驟 1 — 設定 Flask 環境

Ubuntu 24.04 默認搭載 Python 3。打开終端並運行以下命令以核實 Python 3 的安裝:

root@ubuntu:~# python3 --version
Python 3.12.3

如果您的電腦上已經安裝了 Python 3,上述命令將返回 Python 3 的當前版本。如果尚未安裝,您可以運行以下命令進行安裝:

root@ubuntu:~# sudo apt install python3

接下來,您需要在系統上安裝 pip 包安装器:

root@ubuntu:~# sudo apt install python3-pip

一旦 pip 安装完成,我們就来安装 Flask。

您将通过 pip 安装 Flask。建议在虚拟环境中进行此操作,以避免與系統上其他包的冲突。

root@ubuntu:~# python3 -m venv 我的項目環境
root@ubuntu:~# source 我的項目環境/bin/activate
root@ubuntu:~# pip install Flask

步驟 2 – 建立 Flask 應用程式

接下來的步驟是為 Flask 應用程式撰寫 Python 程式碼。為了建立新的腳本,請前往你選擇的目錄:

root@ubuntu:~# cd ~/通往你腳本目錄的路徑

當你在該目錄內時,請建立一個新的 Python 文件,<code>app.py,</code> 並導入 Flask。然後,初始化一個 Flask 應用程式並建立一個基本的路徑。

root@ubuntu:~# nano app.py

這會打開一個空的文字編輯器。你在這裡寫下你的邏輯,或者貼上以下的程式碼:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# 記憶體中的數據存儲
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

步驟 3 — 建立 RESTful 路由

在這個部分,我們將為 Flask 應用程式定義對應於用戶可以對 API 执行的不同操作的路由。每個路由將處理特定的 HTTP 方法。

GET, POST, PUT, 和 DELETE。這些方法對應於永久存儲的四個基本操作,通常稱為CRUD(創建、讀取、更新、刪除)。

將以下路徑添加到您的app.py python腳本中:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# 記憶體數據存儲
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# GET請求:讀取所有項目
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# GET請求:通過ID讀取特定的項目
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# POST請求:創建新的項目
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# PUT請求:更新現有的項目
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# DELETE請求:刪除一個項目
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

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

讓我們更多地了解每個功能做什么:

  • Flask 導入:代碼導入了Flask必要的组件:Flaskjsonifyrequest
  • 記憶體數據存儲items是一个简单的字典列表,作为API的临时数据存储。每个项目都有一个id和一个name
  • GET /api/物品: 當一個 GET 請求對 /api/物品 進行時,服務器回傳项目中所有物品的清單。這對於取得集合中所有資源很有用。

  • POST /api/物品: 對 /api/物品 發送 POST 請求容許客戶端建立新的項目。服務器期望在請求體中包含新项目的詳細信息的面JSON物件。在建立项目後,服務器以新的項目作為回應並返回一個 201 已創建 狀態代碼。

  • PUT /api/物品/: 對 /api/物品/<物品_id> 發送 PUT 請求用於更新具有指定 物品_id 的现有項目。客戶端在請求體中傳送更新的數據,服務器修改现有的項目。如果找不到该项目,则服务器返回一个 404 未找到 错误。

  • DELETE /api/items/: 向/api/items/发出DELETE请求会从数据存储中移除具有指定item_id的项目。如果项目成功删除,服务器会以204 No Content状态码响应,表示删除成功且没有更多内容可返回。

  • 執行應用程式: if __name__ == "__main__":区块確保當腳本直接執行時Flask應用程式會運行。

步驟 4 — 運行和測試您的 API

使用以下命令啟動 Flask 服務器:

root@ubuntu:~# python3 app.py

您應該會看到 Flask 服務器正在運行,並顯示以下輸出:

Output
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-877-972

從上面的輸出中,您可以注意到服務器正在 http://127.0.0.1 上運行,並監聽端口 5000

現在,您可以使用 curl、Postman 或另一款 HTTP 客戶端來測試端點。在這個教程中,您將使用 curl 來測試端點和傳送 HTTP 請求。

打开另一个 Ubuntu 控制台,并逐一执行以下 curl 命令:

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

讓我們看看這些命令的實際作用:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 1, "name": "This is item 1" }, { "id": 2, "name": "This is item 2" } ]

您會發現服務器回傳了项目中所有项目的列表。

使用POST方法,讓我們向數據存儲中添加一個新项目。

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "這是項目3"}' http://127.0.0.1:5000/api/items
Output
{ "id": 3, "name": "This is item 3" }

注意:在您運行Flask服務器的另一個控制台下,您會發現所有HTTP請求正在被执行,以及它們的响应代码。

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

這是监视、錯誤排查和解決服務器問題的好方法。

接下來,讓我們執行一個PUT請求。對/api/items/<item_id>PUT請求將使用指定的item_id更新现有项目。

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "這是更新过的项目1"}' http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

現在,讓我們執行一個GET請求以查看更新的项目1。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

最後,讓我們執行一個DELETE請求以從數據存儲中删除项目。

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

這將從數據存儲中删除项目1。

為此,讓我們執行一個GET請求。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

你會發現項目1已經不存在且已被永久刪除。

結論

在這個教程中,你已經使用Flask建立了基本的REST API應用程式。現在你可以通過添加其他路由、整合資料庫或將其部署到像DigitalOcean這樣的雲端平台來擴展這個API。Flask是一種建造API的强大工具,並且隨著這些基本知識,你已經準備好開始建造更複雜的應用程式。

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu