将Streamlit应用程序部署到AppEngine时需要了解一些事项。
您必须选择灵活的环境,因为它支持WebSockets而标准环境不支持。
Streamlit在服务器和客户端之间的通信严重依赖WebSockets。
您不必使用自定义运行时(原始Docker映像)。
您还可以使用自定义运行时。例如,当您想使用与作为官方运行时提供的版本不同的Python版本时,或者当您已经拥有一个工作的Docker映像时,这是一个不错的选择。
笔记:
截至2021/12/12,文档说内置Python3运行时的Python版本是3.7.2,但实际上至少在asia-northeast1区域(东京)从sys.version知道它是3.6.10。
Streamlit官方只支持Python>u003d3.7,而在技术上可以使用Python3.6安装,所以也许你应该按照下面的部分设置一个使用Python>u003d3.7的自定义运行时。
AppEngine通常会在可用实例之间平均分配请求,因此文件上传/下载请求有时会到达与存在多个实例时会话所在的实例不同的实例。
在这种情况下会出现以下错误。
文件上传出错时:文件上传请求到达不存在会话的服务器,服务器返回400错误码。
文件下载出错时:文件下载请求到达该会话不存在的服务器,返回404响应。
文件上传器/下载器组件会出现此问题,因为它们使用正常的无状态HTTPPOST/GET请求,而其他组件在会话上一致的WebSocket连接之上工作。
虽然我知道至少这些组件会出现此问题,但我不确定是否有另一个组件存在此问题。我没有检查所有。
如文档所说,灵活实例每周重启一次,当没有多个实例时会导致停机。
虽然此问题已在以下帖子中说明,但建议的唯一解决方案是将最小实例数设置为一个以上,尽管它与本文中解释的解决方案相冲突。我找不到涵盖这两个问题的解决方案。
AppEngine提供了会话亲和性设置,但在这种情况下它没有帮助,因为它仅适用于像socket.io这样的HTTP长轮询,因为记录了虽然这个问题是由于不同的原因造成的。
我将展示一些在不同情况下将Streamlit应用程序部署到AppEngine的示例。
它们中的每一个都可以使用以下命令进行部署。
$gcloudappdeploy进入全屏模式退出全屏模式
这是最简单的。
*此应用程序未使用文件上传器或下载器。
.├──app.yaml├──requirements.txt└──streamlit-app.py进入全屏模式退出全屏模式
runtime:pythonenv:flexruntime_config:python_version:3entrypoint:streamlitrunstreamlit-app.py--server.port$PORT进入全屏模式退出全屏模式
streamlit~=1.2.0进入全屏模式退出全屏模式
swz100103swz100105swz100106swz100104swz100107
importstreamlitasstst.title("AppEnginesampleapp")name=st.text_input("Yourname")st.write(f"Hello,{nameor'world'}!")进入全屏模式退出全屏模式
这是一个带有文件上传器和下载器的示例。
zwz100116zwz100118zwz100119zwz100117zwz100120
runtime:pythonenv:flexruntime_config:python_version:3entrypoint:streamlitrunstreamlit-app.py--server.port$PORTautomatic_scaling:max_num_instances:1#Ormanualscalingasbelow:#manual_scaling:#instances:1进入全屏模式退出全屏模式
除了基本设置,automatic_scaling.max_num_instances设置为1。
如果要使用手动缩放,请改用manual_scaling.instances。
zwz100121zwz100126zwz100127zwz100125zwz100131
zwz100132zwz100134zwz100135zwz100133zwz100136
importstreamlitasstst.title("AppEnginesampleapp")uploaded_file=st.file_uploader("Uploadsomefile")ifuploaded_file:st.write(f"{uploaded_file.name}wasuploaded.")st.download_button(f"Download{uploaded_file.name}",data=uploaded_file,file_name=uploaded_file.name)进入全屏模式退出全屏模式
此示例使用带有Dockerfile的自定义运行时。
.├──Dockerfile├──app.yaml├──requirements.txt└──streamlit-app.py进入全屏模式退出全屏模式
zwz100145zwz100147zwz100148zwz100146zwz100149
runtime:customenv:flex进入全屏模式退出全屏模式
swz100160swz100178swz100179swz100177swz100183
zwz100184zwz100186zwz100187zwz100185zwz100188
importsysimportstreamlitasstst.write(sys.version)进入全屏模式退出全屏模式
学AI,认准AIStudio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利>>>
更多推荐
求助!为什么用InsCode部署会出现无限重定向?
如何重塑熊猫。系列
问题:如何重塑熊猫。系列在我看来,它就像pandas.Series中的一个错误。a=pd.Series([1,2,3,4])b=a.reshape(2,2)bb有类型Series但无法显示,最后一条语句给出异常,非常冗长,最后一行是“TypeError:%dformat:anumberisrequired,notnumpy.ndarray”。b.sha