使用 Streamlit 为应用程序添加前端体验¶
本主题介绍如何在 Snowflake Native App 中包含 ` Streamlit <https://streamlit.io/ (https://streamlit.io/)>`_。
关于 Streamlit 和 Snowflake Native App Framework¶
` Streamlit <https://streamlit.io/ (https://streamlit.io/)>`_ 是一个开源 Python 库,可以轻松创建和共享用于机器学习和数据科学的自定义 Web 应用程序。通过使用 Streamlit,可以快速构建和部署强大的数据应用程序。
有关此开源库的信息,请参阅 ` Streamlit 库文档 <https://docs.streamlit.io/ (https://docs.streamlit.io/)>`_。
在 Snowflake Native App Framework 内,您可以使用 Streamlit 执行以下操作:
创建一个前端 Web 应用程序,让使用者能够可视化您的 Snowflake Native App 提供的数据。
创建一个用户界面,让使用者可以向 Snowflake Native App 所使用的其账户内的对象授予权限并创建引用。
有关更多信息,请参阅 请求访问使用者账户中的对象。
备注
有关不受支持的 Streamlit 功能的信息,请参阅 不支持的 Streamlit 功能。
受支持的 Streamlit 库版本¶
Snowflake Native App Framework 支持 Streamlit 库的 1.22.0 和 1.26.0 版本。在 Streamlit 库的更新版本发布时,将包含对这些版本的支持。
参阅 为应用程序设置 Streamlit 版本,了解如何为 Streamlit 应用程序设置版本的信息。
支持的外部包¶
默认情况下,Snowflake Native App 中包含的 Streamlit 应用程序包括在使用者环境中预装的 python
、streamlit
和 snowflake-snowpark-python
包。使用者环境还可以访问这些包所需的依赖项。
不支持的 Streamlit 功能¶
在 Snowflake Native App 中使用 Streamlit 时,当前不支持以下 Streamlit 功能:
不支持自定义组件。
不支持使用 AWS PrivateLink 或 Azure PrivateLink 访问 Streamlit 应用程序。
` st.bokeh_chart <https://docs.streamlit.io/library/api-reference/charts/st.bokeh_chart (https://docs.streamlit.io/library/api-reference/charts/st.bokeh_chart)>`_
` st.cache_data <https://docs.streamlit.io/library/api-reference/performance/st.cache_data (https://docs.streamlit.io/library/api-reference/performance/st.cache_data)>`_
` st.cache_resource <https://docs.streamlit.io/library/api-reference/performance/st.cache_resource (https://docs.streamlit.io/library/api-reference/performance/st.cache_resource)>`_
` st.camera_input <https://docs.streamlit.io/library/api-reference/widgets/st.camera_input (https://docs.streamlit.io/library/api-reference/widgets/st.camera_input)>`_
` st.download_button <https://docs.streamlit.io/library/api-reference/widgets/st.download_button (https://docs.streamlit.io/library/api-reference/widgets/st.download_button)>`_
` st.file_uploader <https://docs.streamlit.io/library/api-reference/widgets/st.file_uploader (https://docs.streamlit.io/library/api-reference/widgets/st.file_uploader)>`_
` st.image <https://docs.streamlit.io/library/api-reference/media/st.image (https://docs.streamlit.io/library/api-reference/media/st.image)>`_
` st.pyplot <https://docs.streamlit.io/library/api-reference/charts/st.pyplot (https://docs.streamlit.io/library/api-reference/charts/st.pyplot)>`_
` st.scatter_chart <https://docs.streamlit.io/library/api-reference/charts/st.scatter_chart (https://docs.streamlit.io/library/api-reference/charts/st.scatter_chart)>`_
` st.set_page_config <https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config (https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config)>`_
不支持 ` st.set_page_config <https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config (https://docs.streamlit.io/library/api-reference/utilities/st.set_page_config)>`_ 命令的
page_title
和page_icon
属性。` st.video <https://docs.streamlit.io/library/api-reference/media/st.video (https://docs.streamlit.io/library/api-reference/media/st.video)>`_
` 自定义组件 <https://docs.streamlit.io/library/components (https://docs.streamlit.io/library/components)>`_,包括:
` component.html() <https://docs.streamlit.io/library/components/components-api#stcomponentsv1html (https://docs.streamlit.io/library/components/components-api#stcomponentsv1html)>`_
` component.iframe() <https://docs.streamlit.io/library/components/components-api#stcomponentsv1iframe (https://docs.streamlit.io/library/components/components-api#stcomponentsv1iframe)>`_
` 自定义主题 <https://docs.streamlit.io/library/advanced-features/theming (https://docs.streamlit.io/library/advanced-features/theming)>`_
` 配置文件 <https://docs.streamlit.io/library/advanced-features/configuration (https://docs.streamlit.io/library/advanced-features/configuration)>`_
以下实验性功能:
st.experimental_set_query_params (https://docs.streamlit.io/library/api-reference/utilities/st.experimental_set_query_params)
在 ` st.markdown <https://docs.streamlit.io/library/api-reference/text/st.markdown (https://docs.streamlit.io/library/api-reference/text/st.markdown)>`_ 中,不支持使用
unsafe_allow_html=True
的不安全 HTML。通过互联网访问网络
锚定链接
创建和测试 Streamlit 应用程序的工作流¶
以下工作流描述了在应用程序包中包含 Streamlit 应用程序的典型工作流。根据应用程序的要求,这可能是一个迭代的过程。
开发原生应用程序。
这包括添加您希望使用者使用 Streamlit 访问的数据内容。有关更多信息,请参阅 Snowflake Native App Framework 工作流程。
查看以下部分,了解 Streamlit 库的受支持版本和不受支持的功能:
开发 Streamlit 应用程序。
请参阅 ` Streamlit 库文档 <https://docs.streamlit.io/ (https://docs.streamlit.io/)>`_,了解使用 Streamlit 开源库的信息。
为 Streamlit 应用程序创建本地目录结构。
请参阅 Streamlit 应用程序的示例目录结构,获得有关如何在应用程序结构中组织 Streamlit 文件的建议。
在
manifest.yml
文件中添加一个用于 Streamlit 应用程序的条目。要包含 Streamlit 应用程序,您必须在
manifest.yml
文件中包含默认 Streamlit 文件的名称。有关更多信息,请参阅 将 Streamlit 应用程序添加到清单文件。向安装脚本添加一条 CREATE STREAMLIT 语句。
运行 CREATE APPLICATION 命令,安装脚本将运行 CREATE STREAMLIT 语句,以创建 Streamlit 对象。此对象包含 Streamlit 应用程序所需的架构和 Python 文件。
配置
environment.yml
文件,以在您的 Streamlit 应用程序中包含其他库。有关更多信息,请参阅 向 Streamlit 应用程序添加额外的包。
将 Streamlit 文件、
environment.yml
文件、安装脚本和manifest.yml
文件上传到命名暂存区。要在应用程序包中包含 Streamlit 代码文件,必须将文件上传到命名暂存区。测试应用程序包。
创建应用程序包和 Streamlit 应用程序所需的文件后,创建一个应用程序对象,以测试安装脚本和
manifest.yml
文件。有关更多信息,请参阅 测试包含 Streamlit 应用程序的应用程序包。
在 Snowsight 中查看 Streamlit 应用程序。
要测试 Streamlit 应用程序,请在 Snowsight 中查看应用程序。请参阅 在 Snowsight 中测试 Streamlit 应用程序。
Streamlit 应用程序的示例目录结构¶
与其他 Python 模块一样,要将 Streamlit 应用程序添加到应用程序包,必须将 Streamlit 代码文件上传到命名暂存区。有关如何将文件上载到暂存区的信息,请参阅 PUT。
要考虑一个 Snowflake Native App 的多个版本,请考虑使用如下目录结构来维护 Streamlit 应用程序和相关应用程序文件:
@test.schema1.stage1:
└── /
├── manifest.yml
├── readme.md
├── scripts/setup_script.sql
└── code_artifacts/
└── streamlit/
└── environment.yml
└── streamlit_app.py
请注意,您创建的目录结构取决于您的应用程序和开发环境的要求。
备注
environment.yml
文件必须与 Streamlit 应用程序的主文件处于同一级别。
有关相对路径的更多信息,请参阅 引用外部代码文件。
将 Streamlit 应用程序添加到清单文件¶
要在应用程序包中包含 Streamlit 文件,请在 manifest.yml
文件中添加以下条目。
artifacts:
...
default_streamlit: app_schema.streamlit_app_na
...
default_streamlit: app_schema.streamlit_app_na
条目指定包含 Streamlit 应用程序的架构的位置。
在装脚本中创建 Streamlit 对象¶
以下示例演示如何在应用程序的安装脚本中使用 CREATE STREAMLIT。
CREATE OR REPLACE STREAMLIT app_schema.my_test_app_na
FROM '/code_artifacts/streamlit'
MAIN_FILE = '/streamlit_app.py';
GRANT USAGE ON SCHEMA APP_SCHEMA TO APPLICATION ROLE app_public;
GRANT USAGE ON STREAMLIT APP_SCHEMA.MY_TEST_APP_NA TO APPLICATION ROLE app_public;
此示例在名为 app_schema
的架构内创建 Streamlit 对象。CREATE STREAMLIT 命令使用 MAIN_FILE 子句指定的 Streamlit 应用程序。目录位置由 FROM 子句的值指定。
请参阅 Streamlit 应用程序的示例目录结构,了解在应用程序包中为 Streamlit 应用程序创建目录结构的信息。
此示例还向应用程序角色授予对架构和 Streamlit 对象的必要权限。
向 Streamlit 应用程序添加额外的包¶
使用 environment.yml
文件,向 Streamlit 应用程序添加额外的 Python 包。例如,要向 Streamlit 添加 scikit-learn
库,将以下内容添加到 environment.yml
文件:
name: sf_env
channels:
- snowflake
dependencies:
- scikit-learn
name
和 channels
属性均为必需。
此外,channels
属性下需要有 - snowflake
键。这表明 ` Snowflake Anaconda 通道 <https://repo.anaconda.com/pkgs/snowflake/ (https://repo.anaconda.com/pkgs/snowflake/)>`_。
备注
只能安装 ` Snowflake Anaconda 通道 <https://repo.anaconda.com/pkgs/snowflake/ (https://repo.anaconda.com/pkgs/snowflake/)>`_ 中列出的包。Snowflake 不支持在 Streamlit 中使用外部 Anaconda 通道。
为应用程序设置 Streamlit 版本¶
Snowflake Native App Framework 支持 Streamlit 库的多个版本。要在 Snowflake Native App 中设置 Streamlit 版,请将 streamlit
添加到 environment.yml
文件的 dependencies
部分,如以下示例所示:
name: sf_env
channels:
- snowflake
dependencies:
- streamlit=1.22.0|1.26.0
Snowflake 建议显式为您的应用程序设置 Streamlit 版本。但如果您目前并未显式设置 Streamlit 库的版本,则系统默认设置 Streamlit 版本 1.22.0。
测试包含 Streamlit 应用程序的应用程序包¶
测试包含 Streamlit 应用程序的应用程序包,请运行 CREATE APPLICATION,以使用命名暂存区中的文件创建应用程序对象,如以下示例所示:
CREATE APPLICATION hello_snowflake_app FROM APPLICATION PACKAGE hello_snowflake_package USING '@hello_snowflake_code.core.hello_snowflake_stage';
根据您需要测试的内容,您可以使用其他形式的 CREATE APPLICATION 创建应用程序对象。例如,您可能希望将 Streamlit 应用程序作为版本或升级的一部分进行测试。请参阅 创建应用程序对象。
在 Snowsight 中测试 Streamlit 应用程序¶
要测试 Streamlit 应用程序,请执行以下操作,在 Snowsight 中查看应用程序:
登录 Snowsight。
在导航菜单中,选择 Data Products » Apps。
选择要查看的 Streamlit 应用程序。
主 Streamlit 应用程序将在 Snowsight 中打开。
可选:如果正在查看多页面 Streamlit 应用程序,请选择一个选项卡以查看其他页面。
在 Snowflake Native App Framework 中对 Streamlit 应用程序进行故障排除¶
如果应用程序显示未知错误,请确保尝试以下部分中描述的解决方案。
确认服务条款¶
要在 Snowflake 中使用 Streamlit 和 Anaconda 提供的包,您必须确认 ` 外部产品条款 <https://www.snowflake.cn/legal/external-offering-terms/>`_。要了解更多信息,请参阅 使用 Anaconda 的第三方包。
防火墙允许列表¶
每个 Streamlit 应用程序都使用一个唯一子域。如果您使用严格的防火墙,请将 *.snowflake.app 添加到防火墙允许列表。将此条目添加到允许列表,允许应用程序与 Snowflake 服务器通信,而不受任何限制。