资讯动态

dlt dltHub 实战:构建、本地运行与云端部署 Streamlit 数据仪表盘

发布时间:2026/9/17 15:30:56 来源:尧图企业网站定制
dlt dltHub 实战构建、本地运行与云端部署 Streamlit 数据仪表盘【免费下载链接】dltdata load tool (dlt) is an open source Python library that makes data loading easy ️项目地址: https://gitcode.com/GitHub_Trending/dl/dlt本文基于 dlt 仓库中的 dltHub 官方指南 Build and deploy a Streamlit app 展开完整走通在 dltHub workspace 中用 Streamlit 构建一个读取 dlt 数据集的仪表盘、本地调试、配置accessprofile、部署到 dltHub 并生成公开分享链接的全流程。读完之后你可以掌握dlthub local serve/dlthub deploy/dlthub serve/dlthub job publish这条命令链的实际用法并理解 dlt 的 workspace 框架是如何自动识别 Streamlit 模块、生成 HTTP 触发的交互式任务interactive job并以受控参数启动streamlit run进程的。Streamlit 应用在 dltHub 中的定位一个普通 .py 文件就是一个交互式任务dltHub 对 Streamlit 的定义非常简单一个导入了streamlit的普通.py文件就是一个 Streamlit 应用运行时runtime会把它当作交互式仪表盘dashboard来提供serve。你不需要注册路由、不需要声明框架实例只要模块命名空间里能看见streamlit模块对象即可。这一约定在源码中有直接实现。dlt 的框架检测器按 marimo → MCP → Streamlit 的顺序探测每个被 manifest 导入的模块见 detectors.py 中的_detect_streamlitdef _detect_streamlit(module: ModuleType) - Optional[TJobDefinition]: Detect streamlit usage by finding the streamlit module in namespace. for obj in module.__dict__.values(): if isinstance(obj, ModuleType) and getattr(obj, __name__, ) streamlit: break else: return None # ... 生成 job 定义一旦命中检测器会为该模块生成如下任务定义job_ref形如jobs.module_name由 _module_job_ref 构造entry_point.job_type interactivelauncher 指向 launchers/streamlit.pyexpose {interface: gui, category: dashboard}即对外暴露为一个 GUI 类仪表盘triggers [http()]表示它由 HTTP 请求触发而非调度触发execute {concurrency: 1}交互式任务同一时刻只允许一个运行实例见 _INTERACTIVE_EXECUTION模块 docstring 会被直接取作任务描述所以仪表盘脚本首行注释如Sample shop dashboard.会出现在 workspace 的任务列表中。从源码结构看有两点值得注意一是检测基于模块对象存在于命名空间所以import streamlit as st、from streamlit import ...等任何别名写法都能被识别这由测试用例 test_detectors.py 及其用例文件 streamlit_standard.py、streamlit_aliased.py 验证二是当同一模块中同时存在 FastMCP 与 Streamlit 时 MCP 检测优先见 test_mcp_wins_over_streamlit。前置条件安装依赖并先加载数据第一步是把 Streamlit 加入 workspace 依赖uv add streamlit文档中的示例仪表盘读取sample_shop_pipeline加载的数据该 pipeline 由uvx dlthub-startlatest脚手架生成详见 Deploy your first pipeline。关键点仪表盘只能展示已经加载过的数据且数据必须落在仪表盘将要读取的同一个 destination 上。跳过这一步的后果是应用能正常启动但每次读取都返回 table not found。两种数据准备方式取决于你当前的调试目标# 方式一本地加载dev profileDuckDB让仪表盘在 dlthub local serve 下可用 uv run dlthub local run load_sample_shop # 方式二在远程部署前先针对 dltHub 上的 prod destination 加载 uv run dlthub run load_sample_shoplocal run对应 CLI 的dlthub local命令组中在本地运行单个 batch 任务的操作见 LocalWorkspaceCommand它解析本地 profile 配置后启动 pipeline而dlthub run则是面向 dltHub 远端的运行命令。两条路径的区别本质上是 profiledev/prod 指向的 destination 不同的区别。编写仪表盘用 dlt.dataset 直连已加载数据在 workspace 根目录创建sample_shop_dashboard.pySample shop dashboard. import dlt import streamlit as st st.set_page_config(page_titleSample shop, layoutwide) st.title(Sample shop orders) st.cache_data def load_data(): dataset dlt.dataset(destinationwarehouse, dataset_namesample_shop) return dataset[orders].df(), dataset[customers].df() orders, customers load_data() col1, col2, col3, col4 st.columns(4) col1.metric(Orders, f{len(orders):,}) col2.metric(Customers, f{len(customers):,}) col3.metric(Total revenue, f${orders[order_total].sum():,.2f}) col4.metric(Avg order value, f${orders[order_total].mean():.2f}) st.subheader(Top customers by spend) by_customer ( orders.merge(customers, left_oncustomer_id, right_onid, suffixes(_o, _c)) .groupby(name, as_indexFalse)[order_total].sum() .sort_values(order_total, ascendingFalse) .head(10) ) st.dataframe( by_customer.rename(columns{name: Customer, order_total: Total spend ($)}), widthstretch, hide_indexTrue, ) st.subheader(Orders by store) by_store orders.groupby(store_id).size().rename(orders).sort_values(ascendingFalse) st.bar_chart(by_store)代码要点dlt.dataset(destinationwarehouse, dataset_namesample_shop)是核心数据入口。它不重新执行 pipeline而是直连一个已经加载完成的数据集dataset 访问机制见 Dataset Accessdestinationwarehouse指向前面配置中的[destination.warehouse]dataset_name则是 pipeline 加载数据时产生的数据集名。dataset[orders].df()把表转成 pandas DataFrame 供 Streamlit 组件消费。st.cache_data包裹取数函数Streamlit 每次 widget 交互都会重跑脚本缓存可以避免每次点击都重新查询 destination。其余部分是标准 Streamlit 用法4 列 metric 卡片展示订单数、客户数、总收入与客单价merge groupby算出消费 Top 10 客户st.bar_chart展示各门店订单量。本地运行dlthub local serveuv run dlthub local serve sample_shop_dashboard.pyserve子命令的 CLI 帮助文本是 Serve an interactive workspace job locally (notebook, dashboard, app)见 commands.py它与dlthub local run共用同一套选择器参数见 _add_common_run_args常用参数包括参数说明selector_or_job_ref任务引用job ref、触发选择器tag:...、schedule:*或直接一个.py文件路径--deployment部署模块路径默认__deployment__.py--job-ref当选择器命中多个任务时指定其中一个--profile覆盖require.profile与 workspace 固定pinned的 profile--dry-run只解析任务并打印入口点不实际启动-c KEYVALUE重复传参把配置键值对透传给任务文档中说明的行为是该命令在 workspace 当前激活的本地 profile默认dev读取.dlt/config.toml下启动仪表盘并在浏览器中打开。这也解释了为什么前置步骤要用local run加载到 DuckDB——本地 serve 走 dev profile读的是本地 destination。源码级原理dlt 如何启动你的 Streamlit 进程dlthub serve本地或远端最终都通过同一个 launcher 启动 Streamlit。launchers/streamlit.py 的run()做了四件事应用 job 配置与环境准备apply_job_configuration从jobs.section.name配置节解析任务行为设置prepare_run_env在用户代码运行前把 profile、interval、时区写入环境变量见 _launcher.py解析运行时参数端口port必须由运行时通过run_args.port下发缺失会抛ValueError可选的base_path会转成--server.baseUrlPath参数用于应用挂载在 URL 子路径下解析框架专属配置从JOBS与任务所在 section 两个配置节解析 StreamlitConfiguration配置项默认值含义enable_corsFalse是否启用 CORS默认在代理后关闭enable_xsrf_protectionFalse是否启用 XSRF 防护默认在代理后关闭gather_usage_statsFalse是否向 Streamlit 上报使用统计拼装命令行并 exec最终执行形如streamlit run script_path \ --server.address0.0.0.0 \ --server.portport \ --server.headlesstrue \ --server.enableCORSfalse \ --server.enableXsrfProtectionfalse \ --server.enableWebsocketCompressionfalse \ --browser.gatherUsageStatsfalse \ --browser.serverAddress0.0.0.0 \ --browser.serverPortport \ [--server.baseUrlPathbase_path]在 POSIX 上通过os.execvp用 Streamlit 进程替换当前进程Windows 上回退为 spawn wait 以正确传播退出码见 exec_process。从源码结构看这套检测器产出 job 定义 → launcher 拼装框架命令 → exec 进程的模式对 marimo、FastMCP、Streamlit 三种框架统一适用launcher 注册表见 launchers/init.pyStreamlit 是其中唯一的纯模块导入即识别的框架。配置 access profiledlthub serve默认在accessprofile 下运行交互式任务。最简脚手架不预置accessprofile因此部署前需要自己创建。在.dlt/access.config.toml中声明 destination 类型[destination.warehouse] destination_type motherduck在.dlt/access.secrets.toml中提供凭据。注意对 MotherDuck 来说database和password必须同时写在 secrets 文件中[destination.warehouse.credentials] database dlt_test password read-only motherduck JWT这里使用只读read-onlyJWT 是一个有意的安全实践仪表盘是只读消费端access profile 的凭据不应具备写权限。完整的 profile 模型local/prod/access等如何组合 config 与 secrets 文件可参阅 Profiles in dltHub。部署到 dltHubmanifest、deploy、serve 与公开链接第一步把仪表盘模块加入__deployment__.pymanifest让 workspace 知晓它的存在Minimal dltHub workspace. from pipeline import load_sample_shop import sample_shop_dashboard # module-import → one job __all__ [load_sample_shop, sample_shop_dashboard]import sample_shop_dashboard这种模块级导入会经过上面的框架检测链被识别为一个jobs.sample_shop_dashboard交互式任务。随后部署并远程启动uv run dlthub deploy # 发布 manifest 上传代码 uv run dlthub serve sample_shop_dashboard.py # 远程启动应用并打开 URL访问控制方面dlthub serve启动的应用运行在 workspace 认证之后——只有你的账号能打开该链接。需要对外分享时用job publish生成公开 URL用job unpublish撤销uv run dlthub job publish sample_shop_dashboard.py # 生成公开 URL uv run dlthub job unpublish sample_shop_dashboard.py # 撤销小结与延伸阅读整条链路可以概括为uv add streamlit→ 先加载数据local run 或 run→ 编写一个dlt.dataset(...)取数的 Streamlit 脚本 →dlthub local serve本地验证 → 配置accessprofile 的 config/secrets → 在__deployment__.py中 import 该模块 →dlthub deploydlthub serve或job publish公开化。仓库中可进一步深入的文件Streamlit launcher 实现最终拼出的streamlit run命令行与配置注入框架检测器marimo/MCP/Streamlit 的识别顺序与 job 定义生成以及模块级__trigger__/__expose__/__require__dunder 的覆盖机制Streamlit 检测测试 与用例脚本验证不同 import 写法均能被识别dltHub 命令行接口文档 与 dlt.dataset 文档命令全集与数据集访问 API。【免费下载链接】dltdata load tool (dlt) is an open source Python library that makes data loading easy ️项目地址: https://gitcode.com/GitHub_Trending/dl/dlt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价