Flask
Flask 是一个轻量级、灵活的 Python Web 框架,以简洁和可扩展性为核心设计理念。它不强制依赖特定库或架构,仅提供核心功能(如路由、模板渲染),开发者可自由选配数据库、表单验证等组件。这种"微框架"特性使其学习成本极低,同时能通过扩展轻松构建复杂应用,特别适合快速开发小型项目或作为微服务基础。
本指南介绍如何在 CloudBase HTTP 云函数上部署 Flask 应用程序。
前置条件
在开始之前,请确保您已经:
- 安装了 Python 3.10 或更高版本
- 拥有腾讯云账号并创建了云开发环境
- 了解基本的 Python 和 Flask 开发知识
第一步:创建 Flask 应用
💡 提示:如果您已经有一个 Flask 应用,可以跳过此步骤。
创建项目目录
mkdir flask-cloudbase
cd flask-cloudbase
设置虚拟环境
# 创建虚拟环境
python -m venv env
# 激活虚拟环境
# Linux/macOS
source env/bin/activate
# Windows
# env\Scripts\activate
安 装 Flask
pip install flask
第二步:编写应用代码
创建 app.py 文件作为应用的入口文件:
⚠️ 重要提示:CloudBase HTTP 云函数要求应用监听 9000 端口。
import os
from flask import Flask, jsonify, request
app = Flask(__name__)
# 配置应用
app.config['DEBUG'] = os.environ.get('DEBUG', 'False').lower() == 'true'
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'your-secret-key-here')
# 模拟数据
users = [
{'id': 1, 'name': '张三', 'email': 'zhangsan@example.com'},
{'id': 2, 'name': '李四', 'email': 'lisi@example.com'},
{'id': 3, 'name': '王五', 'email': 'wangwu@example.com'}
]
@app.route('/')
def hello():
"""根路径处理函数"""
return jsonify({
'message': 'Hello from Flask on CloudBase!',
'framework': 'Flask',
'version': '2.3.0'
})
@app.route('/health')
def health_check():
"""健康检查接口"""
return jsonify({
'status': 'healthy',
'framework': 'Flask',
'python_version': os.sys.version
})
@app.route('/api/users', methods=['GET'])
def get_users():
"""获取用户列表(支持分页)"""
page = request.args.get('page', 1, type=int)
limit = request.args.get('limit', 10, type=int)
# 简单分页逻辑
start_index = (page - 1) * limit
end_index = start_index + limit
paginated_users = users[start_index:end_index]
return jsonify({
'success': True,
'data': {
'total': len(users),
'page': page,
'limit': limit,
'items': paginated_users
}
})
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
"""根据 ID 获取用户"""
user = next((u for u in users if u['id'] == user_id), None)
if not user:
return jsonify({
'success': False,
'message': 'User not found'
}), 404
return jsonify({
'success': True,
'data': user
})
@app.route('/api/users', methods=['POST'])
def create_user():
"""创建新用户"""
data = request.get_json()
if not data or 'name' not in data or 'email' not in data:
return jsonify({
'success': False,
'message': 'Name and email are required'
}), 400
# 检查邮箱是否已存在
if any(u['email'] == data['email'] for u in users):
return jsonify({
'success': False,
'message': 'Email already exists'
}), 400
# 创建新用户
new_user = {
'id': max(u['id'] for u in users) + 1 if users else 1,
'name': data['name'],
'email': data['email']
}
users.append(new_user)
return jsonify({
'success': True,
'data': new_user
}), 201
@app.route('/api/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
"""更新用户信息"""
user_index = next((i for i, u in enumerate(users) if u['id'] == user_id), None)
if user_index is None:
return jsonify({
'success': False,
'message': 'User not found'
}), 404
data = request.get_json()
if not data:
return jsonify({
'success': False,
'message': 'No data provided'
}), 400
# 检查邮箱是否被其他用户使用
if 'email' in data and any(u['email'] == data['email'] and u['id'] != user_id for u in users):
return jsonify({
'success': False,
'message': 'Email already exists'
}), 400
# 更新用户信息
if 'name' in data:
users[user_index]['name'] = data['name']
if 'email' in data:
users[user_index]['email'] = data['email']
return jsonify({
'success': True,
'data': users[user_index]
})
@app.route('/api/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
"""删除用户"""
user_index = next((i for i, u in enumerate(users) if u['id'] == user_id), None)
if user_index is None:
return jsonify({
'success': False,
'message': 'User not found'
}), 404
deleted_user = users.pop(user_index)
return jsonify({
'success': True,
'message': f'User {deleted_user["name"]} deleted successfully'
})
# 错误处理
@app.errorhandler(404)
def not_found(error):
return jsonify({
'success': False,
'message': 'Resource not found'
}), 404
@app.errorhandler(500)
def internal_error(error):
return jsonify({
'success': False,
'message': 'Internal server error'
}), 500
@app.errorhandler(400)
def bad_request(error):
return jsonify({
'success': False,
'message': 'Bad request'
}), 400
if __name__ == '__main__':
# CloudBase HTTP 云函数要求监听 9000 端口
app.run(host='0.0.0.0', port=9000, debug=False)
代码说明
让我们详细解释上述代码的关键部分:
-
Flask 应用创建
app = Flask(__name__)创建 Flask 应用实例,
__name__参数帮助 Flask 识别应用程序的位置。 -
路由装饰器
@app.route('/')def hello():return jsonify({'message': 'Hello from Flask!'})@app.route('/')装饰器定义 URL 路由,当访问根 URL 时执行对应函数。 -
HTTP 方法支持
@app.route('/api/users', methods=['GET', 'POST'])通过
methods参数指定路由支持的 HTTP 方法。 -
错误处理
@app.errorhandler(404)def not_found(error):return jsonify({'error': 'Not Found'}), 404使用
@app.errorhandler装饰器处理特定的 HTTP 错误。
第三步:本地测试
启动应用
python app.py
测试 API 接口
应用启动后,您可以通过以下方式测试:
# 测试根路径
curl http://localhost:9000/
# 测试健康检查
curl http://localhost:9000/health
# 测试用户列表
curl http://localhost:9000/api/users
# 测试分页
curl "http://localhost:9000/api/users?page=1&limit=2"
# 测试获取单个用户
curl http://localhost:9000/api/users/1
# 测试创建用户
curl -X POST http://localhost:9000/api/users \
-H "Content-Type: application/json" \
-d '{"name":"新用户","email":"newuser@example.com"}'
# 测试更新用户
curl -X PUT http://localhost:9000/api/users/1 \
-H "Content-Type: application/json" \
-d '{"name":"更新用户","email":"updated@example.com"}'
# 测试删除用户
curl -X DELETE http://localhost:9000/api/users/1
第四步:配置依赖项
生成 requirements.txt 文件:
pip freeze > requirements.txt
⚠️ 注意:只有在虚拟环境中运行上述命令才是安全的,否则它将生成系统上所有已安装的 Python 包,可能导致云函数无法正常启动。
典型的 requirements.txt 内容:
blinker==1.7.0
click==8.1.7
Flask==2.3.3
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
Werkzeug==2.3.7
第五步:创建启动脚本
💡 注意:
- 在 windows 下创建
scf_bootstrap文件时,优先使用nano scf_bootstrap或者vim scf_bootstrap创建- 在 windows 下使用 vscode 创建
scf_bootstrap文件时,部署到 HTTP 云函数可能会报错:scf_bootstrap文件不存在- 这个错误是因为脚本文件包含了 Windows 格式的回车符(^M),导致 Linux 无法正确识别解释器路径。这是 WSL 中常见的问题
创建 scf_bootstrap 文件(无扩展名):
#!/bin/bash
# 设置 Python 依赖加载路径,我们默认设置在 third_party 目录
export PYTHONPATH="./third_party:$PYTHONPATH"
/var/lang/python310/bin/python3.10 app.py
为启动脚本添加执行权限:
chmod +x scf_bootstrap
💡 说明:
scf_bootstrap是 CloudBase 云函数的启动脚本- 设置 Python 路径并启动 Flask 应用
- 确保应用监听 9000 端口