要让 Python 应用在互联网上运行,您需要一个专门的环境来运行代码、管理其依赖项并将其提供给用户。这就是 Python 托管服务的作用:该服务提供必要的服务器基础设施和软件堆栈,这些基础设施和软件堆栈经过专门配置,可运行使用 Python 编程语言构建的应用。与通用网站托管不同,Python 托管服务是根据 Python 语言的独特要求量身定制的,例如支持特定框架、库和部署标准。
在评估 Python 应用托管选项时,企业开发者应寻找一组特定的功能,这些功能可兼顾开发者在灵活性、控制力和性能方面的要求。稳健的 Python 托管环境通常会提供:
Python 托管解决方案的范围很广,从简单、低成本的选项到功能强大、高度可扩缩的环境,应有尽有。选择哪种方法取决于应用的复杂性、性能要求以及开发者对控制力的需求。
托管类型 | 开发者使用场景 | 您正在尝试解决的示例问题 |
共享托管 | 开发者构建个人博客、使用 Flask 等轻量级框架构建简单的作品集网站,或构建小型项目。 | “我需要一种简单且成本极低的方法来将我的个人项目放到网上。我不需要特殊配置,并且流量很低。” |
VPS(虚拟专用服务器)托管 | 开发者发布需要特定系统软件包的内容管理系统或电子商务网站。 | “我需要安装一个像 Redis 这样的缓存服务器,处理客户网站中等规模的可预测流量,但完整的专用服务器太贵了。” |
云托管/PaaS(平台即服务) | 企业开发者需要构建可伸缩的微服务或 Web API,以处理新产品发布时不可预测的流量。 | “如果我的应用上了新闻,我需要它能自动扩缩,并且我希望专注于编写代码,而不是管理服务器。” |
专用服务器托管 | 开发团队运行资源密集型数据处理应用或具有严格合规性要求的金融服务平台。 | “我的应用在处理大型数据集,需要尽可能多的 CPU 和 RAM,并且其他应用不得争用这些资源。我还需要完全控制硬件,以便进行安全审核。” |
托管类型
开发者使用场景
您正在尝试解决的示例问题
共享托管
开发者构建个人博客、使用 Flask 等轻量级框架构建简单的作品集网站,或构建小型项目。
“我需要一种简单且成本极低的方法来将我的个人项目放到网上。我不需要特殊配置,并且流量很低。”
VPS(虚拟专用服务器)托管
开发者发布需要特定系统软件包的内容管理系统或电子商务网站。
“我需要安装一个像 Redis 这样的缓存服务器,处理客户网站中等规模的可预测流量,但完整的专用服务器太贵了。”
云托管/PaaS(平台即服务)
企业开发者需要构建可伸缩的微服务或 Web API,以处理新产品发布时不可预测的流量。
“如果我的应用上了新闻,我需要它能自动扩缩,并且我希望专注于编写代码,而不是管理服务器。”
专用服务器托管
开发团队运行资源密集型数据处理应用或具有严格合规性要求的金融服务平台。
“我的应用在处理大型数据集,需要尽可能多的 CPU 和 RAM,并且其他应用不得争用这些资源。我还需要完全控制硬件,以便进行安全审核。”
虽然基本部署步骤类似,但不同托管类型的手动工作量和控制水平差异很大。
部署步骤 | 按托管类型划分的注意事项 |
准备申请材料 | 通用:确保所有依赖项都列在 pyproject.toml 文件或 requirements.txt 文件中。 |
选择托管服务提供商 | 通用:根据应用对控制、可伸缩性和预算的需求,选择最合适的选项。 |
设置环境 | 共享:有限制的选项,通常通过 cPanel 控制。 VPS/专用:完整的根访问权限;您需要手动安装 Python、venv 和系统库。 云/PaaS:通常由平台自动处理;您可能只需要在配置文件中指定 Python 版本。 |
上传代码 | 共享:通常通过 FTP 或基于 Web 的文件管理器共享。 VPS/专用:首选 Git(例如 git pull)。 云/PaaS:通常直接与 Git 集成,以实现自动部署(例如 gcloud run deploy)。 |
配置应用 | 共享:配置选项有限。 VPS/专用:完全控制环境变量和服务器配置。 云/PaaS:通过服务配置文件(例如 service.yaml)或 Web 控制台进行管理。 |
安装依赖项 | 共享:可能会受到限制。 VPS/专用:通过 SSH 运行 pip install -r requirements.txt。 云/PaaS:平台通常会在构建流程中根据 requirements.txt 自动安装依赖项。 |
运行迁移(如果适用) | 共享:通常需要在控制面板中使用特定工具。 VPS/专用:直接通过 SSH 运行迁移命令。 云/PaaS:可以配置为部署后脚本的一部分,也可以作为单独的作业运行。 |
启动应用服务器 | 共享:通常由主机预先配置和管理。 VPS/专用:您需要手动安装、配置和运行 WSGI 服务器(例如 Gunicorn)。 云/PaaS:平台自动管理应用服务器。 |
配置网域(可选) | 通用:将自定义网域的 DNS 记录指向托管服务提供的 IP 地址或主机名。 |
部署步骤
按托管类型划分的注意事项
准备申请材料
通用:确保所有依赖项都列在 pyproject.toml 文件或 requirements.txt 文件中。
选择托管服务提供商
通用:根据应用对控制、可伸缩性和预算的需求,选择最合适的选项。
设置环境
共享:有限制的选项,通常通过 cPanel 控制。
VPS/专用:完整的根访问权限;您需要手动安装 Python、venv 和系统库。
云/PaaS:通常由平台自动处理;您可能只需要在配置文件中指定 Python 版本。
上传代码
共享:通常通过 FTP 或基于 Web 的文件管理器共享。
VPS/专用:首选 Git(例如 git pull)。
云/PaaS:通常直接与 Git 集成,以实现自动部署(例如 gcloud run deploy)。
配置应用
共享:配置选项有限。
VPS/专用:完全控制环境变量和服务器配置。
云/PaaS:通过服务配置文件(例如 service.yaml)或 Web 控制台进行管理。
安装依赖项
共享:可能会受到限制。
VPS/专用:通过 SSH 运行 pip install -r requirements.txt。
云/PaaS:平台通常会在构建流程中根据 requirements.txt 自动安装依赖项。
运行迁移(如果适用)
共享:通常需要在控制面板中使用特定工具。
VPS/专用:直接通过 SSH 运行迁移命令。
云/PaaS:可以配置为部署后脚本的一部分,也可以作为单独的作业运行。
启动应用服务器
共享:通常由主机预先配置和管理。
VPS/专用:您需要手动安装、配置和运行 WSGI 服务器(例如 Gunicorn)。
云/PaaS:平台自动管理应用服务器。
配置网域(可选)
通用:将自定义网域的 DNS 记录指向托管服务提供的 IP 地址或主机名。
本部分展示了使用 Python 创建交互式 Web 应用的两个示例,并演示了各种方法和技术。
本分步指南将引导您使用 Flask 框架创建一个简单的交互式 Web 应用。此应用将向用户显示一个表单,处理用户的输入,并显示自定义的回答,这是许多 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 库以用于 Web 框架,同时安装 Gunicorn,这是一个生产级 WSGI 服务器,可用于部署应用。
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>简单表单</title> </head> <body> <h1>请输入您的姓名</h1> <form action="/greet" method="post"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required> <button type="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>简单表单</title>
</head>
<body>
<h1>请输入您的姓名</h1>
<form action="/greet" method="post">
<label for="name">姓名:</label>
<input type="text" id="name" name="name" required>
<button type="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。您应该会看到一个简单的网页,其中有一个要求您输入姓名的表单。输入您的姓名,然后点击“提交”按钮。页面应会刷新并显示个性化的问候语,从而确认您的应用按预期运行。
对于生产部署,您必须使用像 Gunicorn 这样强大的 WSGI 服务器,而不是 Flask 的内置开发服务器。您可以使用以下命令在本地测试此互动:
gunicorn --bind 0.0.0.0:8080 main:app |
gunicorn --bind 0.0.0.0:8080 main:app
现在,这个交互式应用已正确构建并经过验证,可以部署到专业的 Python 服务器托管服务提供商。
此示例演示了如何使用 FastAPI 构建相同的交互式网络表单。FastAPI 是一个现代、快速(高性能)的 Web 框架,用于使用基于标准 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>简单表单</title> </head> <body> <h1>请输入您的姓名</h1> <form action="/greet" method="post"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required> <button type="submit">提交</button> </form> </body> </html> |
<!DOCTYPE html>
<html>
<head>
<title>简单表单</title>
</head>
<body>
<h1>请输入您的姓名</h1>
<form action="/greet" method="post">
<label for="name">姓名:</label>
<input type="text" id="name" name="name" required>
<button type="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 = "简单的 FastAPI 表单应用" dependencies = [ "fastapi", "uvicorn", "Jinja2" ] |
[project]
name = "fastapi-form-app"
version = "0.1.0"
description = "简单的 FastAPI 表单应用"
dependencies = [
"fastapi",
"uvicorn",
"Jinja2"
]
然后,只需指向相应的环境,即可轻松部署。
有关 Python 托管的常见问题解答。
常规网站托管主要针对静态文件(HTML、CSS)和基于 PHP 的系统(如 WordPress)进行了优化,而 Python 托管则专门配置为支持 Python 运行时及其生态系统。这包括提供对不同 Python 版本的访问权限、对 WSGI 应用服务器(如 Gunicorn)的支持,以及用于通过 pip 和 requirements.txt 管理 Python 包的工具。常规托管可能没有安装或提供这些关键组件。
对于许多类型的 Python 托管服务(尤其是 VPS 和专用服务器),SSH(安全外壳)访问权限至关重要。您可以使用它登录服务器的命令行,以直接安装软件包、运行数据库迁移、配置 WSGI 服务器和管理应用文件。虽然一些托管式平台即服务 (PaaS) 解决方案免去了这部分,但拥有 SSH 访问权限可以提供最高级别的控制和灵活性。
是。虽然 Python 托管通常是在 Web 应用的背景下讨论的,但相同的环境也可用于运行其他类型的 Python 脚本。例如,您可以使用 VPS 或 Compute Engine 虚拟机来运行用于数据处理的长期运行的后台工作器、使用 cron 的计划任务或机器学习模型推理服务器。关键在于拥有一个可以安装 Python 及其依赖项的服务器环境。
WSGI(Web 服务器网关接口)服务器(例如 Gunicorn 或 uWSGI)是生产 Python 网站托管设置的关键组成部分。框架(如 Flask 和 Django)附带的开发服务器不适合处理生产流量。WSGI 服务器充当中间人,从强大的前端 Web 服务器(如 NGINX)接收 HTTP 请求,并将其转换为 Python 应用框架可以理解的标准化格式。它负责管理多个工作器进程,专用于确保在负载下的性能和稳定性。
在本地主机上运行 Python 应用的过程,就是在自己的计算机上测试该应用。这是确保代码在受控环境中按预期运行的关键的第一步。生产 Python 托管过程是指获取正常运行的应用并将其部署到连接到互联网的服务器上,让全球用户都能访问。良好的部署流程的目标是使生产环境尽可能与本地主机测试环境相似,以避免出现意外情况,这是容器化等技术的关键优势。
优化性能
专门为 Python 配置的托管环境可以通过使用适当的服务器配置和 WSGI 等技术来提供更好的性能。
简化依赖项管理
对虚拟环境和 pip 的支持让您可以轻松管理项目依赖项,而不会发生冲突。
可面对增长进行扩展
优质的 Python 托管服务(尤其是 Python 云托管服务)可提供明确的途径,让您能够随着用户群和流量的增长来扩展应用资源。
提高开发者工作效率
通过提供包含合适工具的即用型环境,开发者可以减少在服务器管理上花费的时间,将更多时间用于构建应用功能。
广泛的框架支持
这些托管平台旨在兼容 Python Web 框架的庞大生态系统兼容,包括 Django、Flask 和 FastAPI 等等。