如何配置外部服务器同时承担Anvil Uplink与Web应用托管角色
报错核心原因
当前启动的自建anvil-app-server是完全独立的运行实例,与之前使用的Anvil云端平台没有任何关联,两处配置完全割裂:
- 原Uplink脚本使用Anvil在线平台下发的密钥,默认连接Anvil官方云端服务,不会和本地自建的应用托管实例建立通信链路
- 从Anvil在线平台克隆的应用仓库仅包含客户端前端代码,此前跑在外部Uplink上的
get_name、add_nums服务函数,没有被注册到自建Anvil的服务运行时中,客户端发起调用时自然无法匹配到对应函数。
同服务器双重角色配置方案
要实现同一台服务器同时承担Web应用托管、Uplink节点服务的角色,按以下步骤调整即可:
1. 启动自建托管服务时指定专属Uplink密钥
自建实例的Uplink认证密钥不会和Anvil在线平台的密钥通用,需要在启动anvil-app-server进程时手动指定:
anvil-app-server --app Hello_World --origin https://somewhere.domain.com --uplink-key self_hosted_uplink_2024
这个自定义的密钥字符串是后续Uplink节点连接时的唯一认证凭证,需全程保持一致。
2. 调整Uplink脚本的连接指向
修改原有Uplink服务脚本的连接配置,让它指向当前自建的Anvil服务,而非Anvil官方云端:
import anvil.server # 建立与本地自建Anvil服务的连接 anvil.server.connect( server_url="wss://你的自定义域名/_/uplink/ws", key="self_hosted_uplink_2024" # 必须与启动托管服务时填写的uplink-key完全一致 ) @anvil.server.callable def get_name(name): response = "Hello from the server, %s!" % name return response @anvil.server.callable def add_nums(num1,num2): result = int(num1)+int(num2) return result anvil.server.wait_forever()
若Uplink脚本和托管服务运行在同一台服务器上,server_url可直接替换为本地回环地址
ws://127.0.0.1:托管服务监听端口/_/uplink/ws,减少公网网络开销。
3. 按顺序启动进程验证效果
- 先启动
anvil-app-server托管进程,确认自定义域名可以正常加载应用页面 - 再启动修改后的Uplink脚本,观察进程日志确认无连接报错
- 回到客户端页面触发按钮操作,客户端的函数调用会被自建托管服务路由到当前连接的Uplink节点,即可正常完成响应。
可选简化方案
如果不需要将服务端代码与Web托管进程做隔离,可直接将Uplink脚本中的两个服务函数写入应用仓库内置的ServerModule.py文件。此时自建anvil-app-server启动时会自动注册这些函数,无需额外启动Uplink进程即可直接响应客户端调用。
内容的提问来源于stack exchange,提问作者melsayeh
相关产品推荐
相关产品推荐

