此内容已使用自动机器翻译服务进行翻译,仅供您参考及阅读便利。其中可能包含错误、遗漏,或与原始英文版本存在理解方面的细微差别。如有疑问,请参考原始英文版本。
许多开发人员、数据科学家和研究人员在 Python 笔记本中完成大部分工作:十多年来, Python 笔记本一直是数据科学和共享的事实上的标准。笔记本之所以受欢迎,是因为它们可以轻松编码、探索数据、制作原型和分享结果。Cloudflare 大量使用笔记本,发现越来越多的开发人员使用笔记本处理数据,从分析 HTTP 流量趋势、查询 Workers Analytics Engine 到查询自己存储在 R2 中的 Iceberg 表。
传统笔记本非常强大,但在构建它们时并没有考虑到协作、可重复性或作为数据应用部署的因素。随着使用量在不同团队和工作流程中增长,这些限制开始面临大规模工作的现实。
考虑到这些挑战,marimo 重新构想了笔记本的体验。这是一个开源的反应式 Python 笔记本,具有可重复性,易于在 Git 中跟踪,可作为独立脚本执行并且可部署。我们与 marimo 团队合作,为 Cloudflare 开发人员带来这种简化的、生产友好的体验。减少因工具问题带来的麻烦,将更多时间用于探索数据。
今天,我们隆重宣布三件事:
marimo 笔记本内置 Cloudflare 身份验证 – 直接从笔记本登录您的 Cloudflare 帐户,即可使用 Cloudflare API,无需创建 API 令牌
开源笔记本示例 – 通过适用于 R2、Workers AI、D1 等服务的现成运行的笔记本示例探索您的 Cloudflare 数据
在 Cloudflare 容器上运行 marimo – 轻松将 marimo 笔记本部署到 Cloudflare 容器,实现可扩展、长时间运行的数据工作流
想立即开始探索您的 Cloudflare 数据吗?前往 notebooks.cloudflare.com 。您也可以继续阅读,了解关于 marimo 的更多信息,我们如何在笔记本中简化身份验证,以及如何使用 marimo 在 Cloudflare 上浏览和共享笔记本和应用。
为什么选择 marimo?
marimo 是一个开源的反应式 Python 笔记本,专门为处理数据而设计,从头开始构建,以解决传统笔记本的许多问题。
将 marimo 与传统笔记本区分开来的核心功能在于其响应式执行模型,该模型由单元格上的静态推理数据流图谱提供支持。运行一个单元格或与 UI 元素交互,marimo 要么运行依赖的单元格,要么将其标记为过时(您的选择)。这可以保持代码和输出的一致性,防止错误发生,并显着提高用数据进行实验的速度。
得益于被动执行,笔记本也可作为数据应用部署,易于共享。虽然您可以在本地、在云服务器、GPU —— 任何可以传统上运行软件的地方运行 marimo 笔记本,但你也可以通过 WebAssembly 完全在浏览器中运行它们,使共享成本降至零。
因为 marimo 笔记本以 Python 格式存储,所以它们享受软件的所有好处:使用 Git 管理版本,作为脚本或管道执行,使用 pytest 测试,使用 uv 内联包要求,并将符号从笔记本导入其他 Python 模块。虽然存储为 Python,marimo 也支持 SQL 和数据源,例如 DuckDB、Postgres 和基于 Iceberg 的数据目录(除了 RAM 中的数据外,marimo 的AI 助手还可以访问这些数据目录)。
要了解 marimo 笔记本是什么样的,请查看下面的嵌入式示例笔记本:
使用 marimo 探索您的 Cloudflare 数据
准备好在 marimo 笔记本中探索您自己的 Cloudflare 数据了吗?最简单的开始方法是访问 notebooks.cloudflare.com 并通过 WebAssembly (Wasm) 直接在浏览器中运行我们的一个示例笔记本。您也可以在我们的笔记本示例 GitHub 存储库中浏览源代码。
想要创建自己的笔记本在本地运行?下面是一个简单示例,向您展示如何使用您的 Cloudflare 帐户进行身份验证,并列出您有权访问的区域:
mkdir cloudflare-zones-notebook
cd cloudflare-zones-notebook
3. 初始化一个新的 uv 项目(这将创建一个 .venv
和一个pyproject.toml
):
uv init
4. 添加 marimo 和所需的依赖项:
uv add marimo
5. 创建一个名为 list-zones.py
的文件,并将以下笔记本粘贴到其中:
import marimo
__generated_with = "0.14.10"
app = marimo.App(width="full", auto_download=["ipynb", "html"])
@app.cell
def _():
from moutils.oauth import PKCEFlow
import requests
# Start OAuth PKCE flow to authenticate with Cloudflare
auth = PKCEFlow(provider="cloudflare")
# Renders login UI in notebook
auth
return (auth,)
@app.cell
def _(auth):
import marimo as mo
from cloudflare import Cloudflare
mo.stop(not auth.access_token, mo.md("Please **sign in** using the button above."))
client = Cloudflare(api_token=auth.access_token)
zones = client.zones.list()
[zone.name for zone in zones.result]
return
if __name__ == "__main__":
app.run()
6. 打开笔记本编辑器:
uv run marimo edit list-zones.py --sandbox
7. 根据笔记本中的 OAuth 提示符登录。通过身份验证后,您将在最终单元格中看到 Cloudflare 区域的列表。
大功告成!从这里,您可以展开笔记本以调用 Workers AI 模型,查询 R2 Data Catalog 中的 Iceberg 表,或与任何 Cloudflare API 交互。
OAuth 在笔记本中的工作方式
您可以把 OAuth 想象成笔记本和 Cloudflare 之间的一次安全握手。无需复制粘贴 API 令牌,您只需点击“使用 Cloudflare 登录”,笔记本会处理剩下的事情。
我们使用 PKCE(代码交换证明密钥)构建这种体验,这是一种安全的 OAuth 2.0 流程,无需使用客户端密钥,并能防止代码拦截攻击。PKCE 的工作原理是生成一个一次性代码,该代码可在登录后交换令牌,永远不需要共享客户端密钥。了解有关 PKCE 如何工作的更多信息。
登录小部件位于 Cloudflare 和 marimo 合作的 moutils.oauth 中,使笔记本中的 OAuth 身份验证简单而安全。要使用它,只需创建一个如下所示的单元格:
auth = PKCEFlow(provider="cloudflare")
# Renders login UI in notebook
auth
运行单元格时,您将看到一个“使用 Cloudflare 登录”按钮:
登录后,您将拥有一个可在使用 Cloudflare API 时传递的只读访问令牌。
在 Cloudflare 上运行 marimo:Workers 与容器
除了在本地运行 marimo 笔记本外,您还可以使用 Cloudflare 通过 Workers 静态资产 或 Cloudflare 容器共享和运行它们。
如果您有本地笔记本想与他人分享,可将其发布到 Workers。这之所以可行,是因为 marimo 可以将笔记本导出到 WebAssembly,从而使它们可以完全在浏览器中运行。您可以仅使用两个命令来开始:
marimo export html-wasm notebook.py -o output_dir --mode edit --include-cloudflare
npx wrangler deploy
如果您的笔记本需要身份验证,可叠加 Cloudflare Access,实现经过身份验证的安全访问。
对于需要更多计算能力、持久会话或长时间运行的任务的笔记本,您可以在我们的新容器平台上部署 marimo。要开始使用,请在 GitHub 上查看我们的 marimo 容器示例。
Cloudflare + marimo 的下一步计划
这篇博文仅仅标志着 Cloudflare 与 marimo 合作的开端。虽然我们很期待看到您如何使用我们基于 WebAssembly 的联合笔记本平台来探索 Cloudflare 数据,但我们也希望帮助您对您的数据进行认真的计算——使您能够直接运行大规模分析和批处理作业。通过 marimo 笔记本。敬请关注!