深色模式
Python 云函数
云函数让您可以运行 Python 后端代码,处理动态 API 请求、操作文件、调用外部 API 等。只需将文件命名为 .py 结尾(如 api.py),代码就会在服务器后端执行。
第一个云函数
在文件列表中创建一个以 .py 结尾的 Python 文件,例如 hello.py。使用 print 输出响应正文:
python
print("Hello, World!")访问这个文件,您会看到「Hello, World!」。就这么简单!
由于代码在服务器上运行,当您通过浏览器开发者工具检查时,不会看到任何 Python 代码,只会看到运行结果,因为代码是在服务器后端动态执行的。
获取请求信息
我们提供了全局的 request 对象,其风格受 Flask 启发。您可以使用 request 对象访问请求参数。
访问查询参数
您可以通过 request.args 访问 URL 查询参数。例如,当网址带有 ?name=Alice 时,您可以这样获取 name 参数的值:
python
name = request.args.get("name")
print(name) # 输出 "Alice"访问 POST 参数
对于 POST 请求,您可以通过 request.form 访问请求体中的表单参数。例如,假设您发送了一个包含 message=Hello 的 POST 请求,您可以这样获取 message 参数的值:
python
message = request.form.get("message")
print(message) # 输出 "Hello"获取请求头
您可以通过 request.headers 访问请求头。请求头的名称不区分大小写。例如,获取名为 Accept-Language 的请求头:
python
accept_language = request.headers.get("Accept-Language")
print(accept_language)获取 Cookie
您可以通过 request.cookies 访问请求中的 Cookie。例如,获取名为 sessionId 的 Cookie:
python
session_id = request.cookies.get("sessionId")
print(session_id)获取用户代理
您可以通过 request.user_agent.string 获取用户代理信息,了解访客使用的浏览器和操作系统。
python
print(request.user_agent.string)获取来源网址
您可以通过 request.referrer 获取请求的来源网址,即用户从哪个页面来到当前页面。
python
print(request.referrer)获取访客 IP 地址
您可以通过 request.remote_addr 获取访客的 IP 地址:
python
ip = request.remote_addr
print(ip)获取当前网址
您可以通过 request.url 获取当前请求的完整网址,或通过 request.path 获取路径部分:
python
print(request.url)
print(request.path)获取请求方法
您可以通过 request.method 获取当前请求方法(如 GET、POST 等):
python
method = request.method
print(method) # 输出 "GET" 或 "POST"获取 JSON 请求体
如果客户端提交的是 JSON 格式的请求体,您可以使用 request.get_json() 将其解析为 Python 对象:
python
data = request.get_json()
print(data["message"])响应请求
输出内容
您可以使用 print 输出内容。例如:
python
print("Hello, World!")需要显式构造响应时,可将 Flask 风格的辅助函数结果赋值给全局 response:
python
response = make_response("Hello, World!")输出 JSON
jsonify 会序列化数据并将 Content-Type 设置为 application/json:
python
response = jsonify({"message": "Hello, JSON!"})您不需要导入 jsonify,它是全局可用的。
设置响应状态码
默认状态码为 200(成功)。您可以使用 make_response 函数更改响应的 HTTP 状态码。例如,设置状态码为 404(未找到):
python
response = make_response("Not Found", 404)您也可以使用 abort 立即返回对应的 HTTP 错误:
python
abort(404)您可以在 MDN 或 HTTP Cats 查看各个状态码的含义。
设置响应头
使用 make_response 创建响应后,可通过 response.headers 设置响应头:
python
response = make_response("Cached")
response.headers["Cache-Control"] = "max-age=3600"设置 Cookie
您可以使用 response.set_cookie 函数设置 Cookie。例如,设置一个名为 username 的 Cookie,值为 Alice,并设置过期时间为 7 天:
python
response = make_response("Cookie set")
response.set_cookie("username", "Alice", max_age=7 * 24 * 60 * 60)使用 response.delete_cookie 删除 Cookie:
python
response.delete_cookie("username")Cookie 支持 expires、max_age、secure、httponly、samesite 和 partitioned 等参数,并可在同一响应中设置多个 Cookie。
重定向跳转
redirect 会创建重定向响应。例如,将当前请求重定向到百度首页:
python
response = redirect("https://www.baidu.com/")如果您想让浏览器和搜索引擎知道这是一个永久重定向,可以传入响应状态码 301:
python
response = redirect("https://www.baidu.com/", 301)提前退出程序
如果您想在某些条件下提前终止程序执行,可以使用 sys.exit 函数,这会立即停止程序运行。
python
print("1")
sys.exit()
print("2")您会看到输出结果只有 "1",因为程序在执行到 sys.exit() 时就停止了,后续代码不会被执行。
读写文件
您可以使用内置的 open 函数读写同网站上的文件,用法与 Python 基本一致。
读取文件
您可以使用 open 读取文件内容。例如,读取当前网站下的 data.txt 文件:
python
with open("data.txt") as file:
content = file.read()
print(content)如果文件不存在,会抛出 FileNotFoundError 错误。您可以使用 os.path.exists 先判断文件是否存在:
python
import os
if os.path.exists("data.txt"):
with open("data.txt") as file:
print(file.read())
else:
print("文件不存在。")请注意
文件路径始终相对于网站根目录,与云函数文件所在的文件夹无关。例如,如果文件位于网站根目录下的 databases 文件夹中,应这样读取:
python
with open("databases/data.txt") as file:
print(file.read())读取 JSON 文件
您可以使用 json 模块读取 JSON 文件内容并转换为 Python 对象。例如,读取当前网站下的 data.json 文件:
python
import json
with open("data.json") as file:
data = json.load(file)写入文件
您可以使用 open 以写入模式("w")打开文件来写入内容。例如,向当前网站下的 data.txt 文件写入新内容覆盖原有内容:
python
with open("data.txt", "w") as file:
file.write("Hello, File!")出于安全原因,不能写入 CSS、JavaScript、PHP、Python 等类型的代码文件。
请注意
由于技术限制,目前只有当网站的文本文件总大小不超过 4 MB 时,才能读写文件和引入其他文件。您可以在写入前使用 shutil.disk_usage 检查剩余空间:
python
import shutil
free_space = shutil.disk_usage(".").free
print(f"剩余空间:{free_space} 字节")如需存储用户数据,请使用数据库。数据库不限制总空间大小。
写入 JSON 文件
您可以使用 json.dumps 将 Python 对象转换为字符串,然后写入 JSON 文件。例如,向当前网站下的 data.json 文件写入数据:
python
import json
data = {"key": "value"}
with open("data.json", "w") as file:
file.write(json.dumps(data, ensure_ascii=False))列出文件
您可以使用 os.listdir 列出当前网站下的所有文件和文件夹。例如,列出当前网站下的所有文件:
python
import os
files = os.listdir(".")
print(files)调用外部 API
Python 云函数可以使用内置的 requests.get() 调用外部 API:
python
import requests
api_response = requests.get(
"https://example.com/api",
params={"page": 1},
headers={"Accept": "application/json"},
timeout=10,
)
if api_response.ok:
response = jsonify(api_response.json())
else:
abort(api_response.status_code)引入其他文件
您可以使用 import 语句引入同网站上的其他 Python 云函数,实现代码模块化,用法与标准 Python 一致。
导入模块
在被引入的文件中,像平常一样定义函数、类或变量。例如,创建一个 utils.py 文件:
python
def add(a, b):
return a + b
def greet(name):
return f"Hello, {name}!"在云函数文件中,使用 import 引入。注意 import 时不需要写 .py 后缀。例如,在 api.py 中引入上面的 utils.py:
python
from utils import add, greet
print(greet("Alice"))
print(add(3, 5))您也可以引入整个模块:
python
import utils
print(utils.greet("Alice"))请注意
如果被引入的文件位于某个文件夹中,需要使用完整的路径,并将路径中的 / 写成 .。例如,如果 utils.py 在 lib 文件夹中,应该这样引入:
python
from lib.utils import greetPython 内置模块
您可以引入 Python 内置模块来扩展云函数的功能。目前支持以下模块:
collections:用于处理容器数据类型。datetime:用于处理日期和时间。decimal:用于进行高精度十进制运算。fractions:用于进行分数运算。functools:用于扩展和操作函数。html:用于处理 HTML 文本。itertools:用于创建和操作迭代器。json:用于解析和生成 JSON 数据。math:用于进行数学运算。os:用于获取操作系统相关信息。random:用于生成随机数和随机选择数据。re:用于使用正则表达式处理文本。requests:用于发送 HTTP 请求。shutil:用于执行文件和目录操作。statistics:用于进行统计计算。string:用于处理常见的字符串操作。sys:用于访问 Python 运行环境相关信息。time:用于处理时间和计时。
与标准的差异
云函数运行在热铁盒自研的 Serverless 环境中,和传统的 Python 运行环境有一些差异。目前暂不支持安装 pip 依赖。