如要在網路上執行 Python 應用程式,需要專門的環境來執行程式碼、管理依附元件,並將應用程式提供給使用者。Python 託管服務就是為此而生。這類服務提供必要的伺服器基礎架構和軟體堆疊,專門用來執行以 Python 程式設計語言建構的應用程式。與一般網站代管服務不同,Python 託管服務專為滿足該語言的獨特需求而設計,例如支援特定框架、程式庫和部署標準。
企業開發人員在評估 Python 應用程式託管服務時,應尋找具備特定功能組合的服務,確保彈性、控管能力和效能。完善的 Python 託管環境通常具備下列特點:
Python 託管解決方案的範圍很廣,從簡單的低成本選項到強大、高度可擴充的環境都有。選擇哪種做法,取決於應用程式的複雜度、效能需求,以及開發人員對控管權的需求。
託管類型 | 開發人員應用實例 | 您嘗試解決的問題例子 |
共用託管 | 開發人員使用 Flask 等輕量級框架,建立個人網誌、簡單的作品集網站或小型專案。 | 「我需要一種簡單且成本極低的方式,將個人專案上線。我不需要特殊設定,流量也會很低。」 |
VPS (虛擬私人伺服器) 託管服務 | 開發人員推出內容管理系統或電子商務網站,需要特定系統套件。 | 「我需要安裝 Redis 等快取伺服器,並處理客戶網站的適度、可預測流量,但專用伺服器的費用太高了。」 |
雲端託管/PaaS (平台即服務) | 企業開發人員正在建構可擴充的微服務或網路 API,且必須處理新產品推出時無法預測的流量。 | 「我希望應用程式規模能自動隨著使用人數增加而擴充,因為我想專心設計程式,而非管理伺服器。」 |
專用伺服器託管 | 開發團隊執行耗用大量資源的資料處理應用程式,或金融服務平台必須遵守嚴格的法規。 | 「我的應用程式會處理大型資料集,因此必須用到所有 CPU 和 RAM,無法與其他項目爭用。此外,我還需要完全控管硬體,以便進行安全稽核。」 |
託管類型
開發人員應用實例
您嘗試解決的問題例子
共用託管
開發人員使用 Flask 等輕量級框架,建立個人網誌、簡單的作品集網站或小型專案。
「我需要一種簡單且成本極低的方式,將個人專案上線。我不需要特殊設定,流量也會很低。」
VPS (虛擬私人伺服器) 託管服務
開發人員推出內容管理系統或電子商務網站,需要特定系統套件。
「我需要安裝 Redis 等快取伺服器,並處理客戶網站的適度、可預測流量,但專用伺服器的費用太高了。」
雲端託管/PaaS (平台即服務)
企業開發人員正在建構可擴充的微服務或網路 API,且必須處理新產品推出時無法預測的流量。
「我希望應用程式規模能自動隨著使用人數增加而擴充,因為我想專心設計程式,而非管理伺服器。」
專用伺服器託管
開發團隊執行耗用大量資源的資料處理應用程式,或金融服務平台必須遵守嚴格的法規。
「我的應用程式會處理大型資料集,因此必須用到所有 CPU 和 RAM,無法與其他項目爭用。此外,我還需要完全控管硬體,以便進行安全稽核。」
雖然基本部署步驟類似,但每種託管服務需要的人工作業和控管程度差異很大。
部署步驟 | 各類託管服務的注意事項 |
準備應用程式 | 通用:確保 pyproject.toml 檔案或 requirements.txt 檔案列入所有依附元件。 |
選擇託管服務供應商 | 通用做法:根據應用程式的控管、擴充性和預算需求,選擇最合適的服務。 |
設定環境 | 共用:選項有限,通常透過 cPanel 控管。 VPS/專用:您具備完整根層級存取權,但必須手動安裝 Python、venv 和系統程式庫。 雲端/PaaS:通常由平台自動處理,您可能只需在設定檔指定 Python 版本。 |
上傳程式碼 | 共用:通常透過 FTP 或網路式檔案管理工具。 VPS/專用:建議使用 Git (例如 git pull)。 雲端/PaaS:通常直接與 Git 整合以自動部署 (例如:gcloud run deploy)。 |
設定應用程式 | 共用:設定選項有限。 VPS/專用:完全控管環境變數和伺服器設定。 雲端/PaaS:透過服務設定檔 (例如 service.yaml) 或網路控制台管理。 |
安裝依附元件 | 共用:可能受到限制。 VPS/專用:透過 SSH 執行「pip install -r requirements.txt」指令。 雲端/PaaS:平台通常會在以 requirements.txt 為基礎的建構程序中,自動安裝依附元件。 |
執行遷移作業 (如適用) | 共用:通常需要控制台的特定工具。 VPS/專用:透過 SSH 直接執行遷移指令。 Cloud/PaaS:可設定為部署後指令碼的一部分,或以個別工作形式執行。 |
啟動應用程式伺服器 | 共用:通常由主機預先設定及管理。 VPS/專用:必須手動安裝、設定及執行 WSGI 伺服器 (例如 Gunicorn)。 雲端/PaaS:平台會自動管理應用程式伺服器。 |
設定網域 (選用) | 通用做法:將自訂網域的 DNS 記錄指向託管服務提供的 IP 位址或主機名稱。 |
部署步驟
各類託管服務的注意事項
準備應用程式
通用:確保 pyproject.toml 檔案或 requirements.txt 檔案列入所有依附元件。
選擇託管服務供應商
通用做法:根據應用程式的控管、擴充性和預算需求,選擇最合適的服務。
設定環境
共用:選項有限,通常透過 cPanel 控管。
VPS/專用:您具備完整根層級存取權,但必須手動安裝 Python、venv 和系統程式庫。
雲端/PaaS:通常由平台自動處理,您可能只需在設定檔指定 Python 版本。
上傳程式碼
共用:通常透過 FTP 或網路式檔案管理工具。
VPS/專用:建議使用 Git (例如 git pull)。
雲端/PaaS:通常直接與 Git 整合以自動部署 (例如:gcloud run deploy)。
設定應用程式
共用:設定選項有限。
VPS/專用:完全控管環境變數和伺服器設定。
雲端/PaaS:透過服務設定檔 (例如 service.yaml) 或網路控制台管理。
安裝依附元件
共用:可能受到限制。
VPS/專用:透過 SSH 執行「pip install -r requirements.txt」指令。
雲端/PaaS:平台通常會在以 requirements.txt 為基礎的建構程序中,自動安裝依附元件。
執行遷移作業 (如適用)
共用:通常需要控制台的特定工具。
VPS/專用:透過 SSH 直接執行遷移指令。
Cloud/PaaS:可設定為部署後指令碼的一部分,或以個別工作形式執行。
啟動應用程式伺服器
共用:通常由主機預先設定及管理。
VPS/專用:必須手動安裝、設定及執行 WSGI 伺服器 (例如 Gunicorn)。
雲端/PaaS:平台會自動管理應用程式伺服器。
設定網域 (選用)
通用做法:將自訂網域的 DNS 記錄指向託管服務提供的 IP 位址或主機名稱。
本節將透過兩個例子,示範使用 Python 建立互動式網頁應用程式的不同的做法和技術。
以下逐步指南將引導您使用 Flask 框架,建立簡單的互動式網頁應用程式。這個應用程式會向使用者顯示表單、處理輸入內容,並顯示自訂回覆。這是許多 Web 服務和內部工具的基本運作模式。
首先建立專案資料夾,然後前往該資料夾。為避免造成衝突,請務必建立虛擬環境來區隔專案依附元件,最佳做法就是建立專案資料夾。
mkdir python-form-app && cd python-form-app python3 -m venv venv source venv/bin/activate |
mkdir python-form-app && cd python-form-app
python3 -m venv venv
source venv/bin/activate
安裝 Flask 程式庫做為網路框架,並安裝正式環境等級 WSGI 伺服器 Gunicorn,為應用程式提供服務。
pip install Flask gunicorn |
pip install Flask gunicorn
接著建立名為 main.py 的檔案。這段程式碼會設定兩個路徑:一個用來顯示 HTML 表單 (GET 要求),另一個用來處理提交的表單 (POST 要求)。
import os from flask import Flask, request, render_template_string app = Flask(__name__) # 為求簡便,請直接在程式碼中定義表單的 HTML 範本 FORM_TEMPLATE = """ <!DOCTYPE html> <html> <head> <title>Simple Form</title> </head> <body> <h1>Please enter your name</h1> <form action="/greet" method="post"> <label for="name">Name:</label> <input type="text" id="name" name="name" required> <button type="submit">Submit</button> </form> </body> </html> """ # 這個路徑會顯示表單 @app.route("/", methods=['GET']) def show_form(): return render_template_string(FORM_TEMPLATE) # 這個路徑會處理提交的表單 @app.route("/greet", methods=['POST']) def greet_user(): user_name = request.form['name'] if not user_name: user_name = "World" return f"<h1>Hello, {user_name}!</h1>" if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080))) |
import os
from flask import Flask, request, render_template_string
app = Flask(__name__)
# 為求簡便,請直接在程式碼中定義表單的 HTML 範本
FORM_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>Simple Form</title>
</head>
<body>
<h1>Please enter your name</h1>
<form action="/greet" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<button type="submit">Submit</button>
</form>
</body>
</html>
"""
# 這個路徑會顯示表單
@app.route("/", methods=['GET'])
def show_form():
return render_template_string(FORM_TEMPLATE)
# 這個路徑會處理提交的表單
@app.route("/greet", methods=['POST'])
def greet_user():
user_name = request.form['name']
if not user_name:
user_name = "World"
return f"<h1>Hello, {user_name}!</h1>"
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
建立 requirements.txt 檔案來列出專案的依附元件。這個檔案會指示伺服器該安裝哪些套件,因此無論要部署的託管環境為何,這個檔案都相當重要。
pip freeze > requirements.txt |
pip freeze > requirements.txt
在本機執行應用程式,確認表單正常顯示且提交邏輯正常運作。
python main.py |
python main.py
現在開啟網路瀏覽器,前往 http://localhost:8080。您應該會看到一個簡單網頁,其中顯示要求您輸入名稱的表單。輸入您的名稱,然後點選「提交」按鈕。網頁會重新整理並顯示個人化問候,確認應用程式正常運作。
部署至正式環境時,請務必使用穩固的 WSGI 伺服器 (例如 Gunicorn),而非 Flask 的內建開發伺服器。您可以使用下列指令,在本機測試這項互動:
gunicorn --bind 0.0.0.0:8080 main:app |
gunicorn --bind 0.0.0.0:8080 main:app
這個互動式應用程式已正確建構完成並通過驗證,可以部署至專業供應商的 Python 伺服器託管服務。
以下將舉例示範如何使用 FastAPI 建構相同的互動式網路表單。FastAPI 是一項快速 (高效能) 的新型框架,可根據標準 Python 類型提示,使用 Python 3.7 以上版本建構 API。同時,本例將使用 Uvicorn 做為 ASGI 伺服器。這種做法非常適合需要高並行處理量的非同步應用程式。
首先,建立專案目錄並設定虛擬環境。我們在這裡採用一項新工具 uv。與傳統工具相比,uv 可省略許多步驟,而且速度快 100 倍:
mkdir fastapi-form-app && cd fastapi-form-app uv venv .venv source .venv/bin/activate #for linux or mac .venv\Scripts\activate #for windows |
mkdir fastapi-form-app && cd fastapi-form-app
uv venv .venv
source .venv/bin/activate #for linux or mac
.venv\Scripts\activate #for windows
只需一個步驟即可安裝程式庫:
uv pip install fastapi uvicorn Jinja2 |
uv pip install fastapi uvicorn Jinja2
建立名為 main.py 的檔案,並在其中加入下列內容:
from fastapi import FastAPI, Form, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates import os app = FastAPI() templates = Jinja2Templates(directory="templates") @app.get("/", response_class=HTMLResponse) async def show_form(request: Request): return templates.TemplateResponse("form.html", {"request": request}) @app.post("/greet", response_class=HTMLResponse) async def greet_user(request: Request, name: str = Form(...)): if not name: name = "World" return templates.TemplateResponse("greeting.html", {"request": request, "name": name}) |
from fastapi import FastAPI, Form, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
import os
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def show_form(request: Request):
return templates.TemplateResponse("form.html", {"request": request})
@app.post("/greet", response_class=HTMLResponse)
async def greet_user(request: Request, name: str = Form(...)):
if not name:
name = "World"
return templates.TemplateResponse("greeting.html", {"request": request, "name": name})
建立名為 templates 的目錄,並加入下列檔案:
templates/form.html:
<!DOCTYPE html> <html> <head> <title>Simple Form</title> </head> <body> <h1>Please enter your name</h1> <form action="/greet" method="post"> <label for="name">Name:</label> <input type="text" id="name" name="name" required> <button type="submit">Submit</button> </form> </body> </html> |
<!DOCTYPE html>
<html>
<head>
<title>Simple Form</title>
</head>
<body>
<h1>Please enter your name</h1>
<form action="/greet" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<button type="submit">Submit</button>
</form>
</body>
</html>
templates/greeting.html:
<!DOCTYPE html> <html> <head> <title>Greeting</title> </head> <body> <h1>Hello, {{ name }}!</h1> </body> </html> |
<!DOCTYPE html>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
使用 Uvicorn 執行應用程式:
uvicorn main:app --reload |
uvicorn main:app --reload
開啟網路瀏覽器並前往 http://localhost:8000。您應該會看到一份表單。輸入名稱並提交後,系統就會顯示個人化問候。--reload 旗標可在程式碼變更時自動重新載入應用程式,加快測試程序。
部署時,請確認 pyproject.toml 檔案已指定依附元件。您可以使用 uv 等工具進一步簡化這個流程,不過基本範例如下:
[project] name = "fastapi-form-app" version = "0.1.0" description = "Simple FastAPI form app" dependencies = [ "fastapi", "uvicorn", "Jinja2" ] |
[project]
name = "fastapi-form-app"
version = "0.1.0"
description = "Simple FastAPI form app"
dependencies = [
"fastapi",
"uvicorn",
"Jinja2"
]
接著只要指向環境,即可輕鬆部署。
Python 託管服務常見問題。
一般網站託管服務主要針對靜態檔案 (HTML、CSS) 和以 PHP 為基礎的系統 (如 WordPress) 進行最佳化;Python 託管服務則經過專門設定,主要支援 Python 執行階段和相關生態系統。這包括提供不同 Python 版本、WSGI 應用程式伺服器 (例如 Gunicorn) 支援服務,以及透過 pip 和 requirements.txt 管理 Python 套件的工具。一般託管服務可能未安裝或未提供這些重要元件。
SSH (安全殼層) 存取權是多種 Python 託管服務的必要元素,尤其是 VPS 和專屬伺服器。這項存取權能讓您登入伺服器指令列來安裝套件、遷移資料庫、設定 WSGI 伺服器,以及直接管理應用程式檔案。雖然部分代管平台即服務 (PaaS) 解決方案會將這類作業抽象化,但有了 SSH 存取權,就能獲得最高層級的控管能力和彈性。
是,雖然 Python 託管服務通常用於網頁應用程式,但這個環境同樣能用來執行其他類型的 Python 指令碼。舉例來說,您可以使用 VPS 或 Compute Engine VM 長時間執行背景 worker 來處理資料、使用 cron 執行排定的工作,或執行機器學習模型推論伺服器。重點在於具備可安裝 Python 和相關依附元件的伺服器環境。
WSGI (網路伺服器閘道介面) 伺服器,是正式託館 Python 網站的重要元素。這類伺服器包括 Gunicorn、uWSGI 等。相較之下,Flask 和 Django 等框架預先安裝的開發伺服器不適合處理正式環境流量。WSGI 伺服器可做為中介服務,從穩固的前端網路伺服器 (例如 NGINX) 接收 HTTP 要求,然後轉換為 Python 應用程式框架可理解的標準化格式。這類伺服器不僅能管理多個工作站程序,還能在負載狀態下維持高效能和穩定性。
在 localhost 執行 Python 應用程式,是指在自己的電腦上測試 Python 應用程式。要確保程式碼在受控環境中正常運作,這是關鍵的第一步。正式託管 Python,則是指將正常運作的應用程式部署到連上網際網路的伺服器,讓全球使用者存取。良好的部署程序應盡可能讓正式環境與 localhost 測試環境相似,以避免發生意外。容器化等技術的主要好處就是能做到這點。
效能最佳化
專為 Python 設置的託管環境,透過適當的伺服器設定和 WSGI 等技術,提供更優異的效能。
簡化依附元件管理作業
支援虛擬環境和 pip,可輕鬆管理專案依附元件,避免造成衝突。
擴充性高,可支援應用程式成長
優質的 Python 託管服務,特別適合用來將 Python 應用程式託管於雲端,可提供明確的途徑,讓您隨著使用者人數和流量增加,調度應用程式資源。
提升開發人員效率
Python 託管服務提供立即可用的環境並內建合適工具,讓開發人員能減少管理伺服器的時間,專心建構應用程式功能。
支援多種架構
許多託管平台與龐大 Python 網路架構生態系統相容,包括 Django、Flask、FastAPI。