Skip to content

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)

您可以通过 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)

您可以在 MDNHTTP Cats 查看各个状态码的含义。

设置响应头

使用 make_response 创建响应后,可通过 response.headers 设置响应头:

python
response = make_response("Cached")
response.headers["Cache-Control"] = "max-age=3600"

您可以使用 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 支持 expiresmax_agesecurehttponlysamesitepartitioned 等参数,并可在同一响应中设置多个 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.pylib 文件夹中,应该这样引入:

python
from lib.utils import greet

Python 内置模块

您可以引入 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 依赖。