我有一个 HTML 触发的云函数,其权限设置为 allUsers:
当我访问触发地址的函数时,它正确返回了一个 HTML 页面,但在相关样式表上给出了一个 Forbidden 错误:
我没有看到任何关于如何在云函数中配置单个文件夹权限的文档。Python 运行时使用的 Flask 服务器将所有静态资源放在 css、img 和 js 文件夹中,/static
而不是单独的 css、img 和 js 文件夹中 - 我没有尝试将 Flask 配置到其他地方,因为默认位置失败没有任何非魔法原因。
笔记:App Engine 有一个 app.yaml 配置文件(https://cloud.google.com/appengine/docs/standard/python3/serving-static-files),但我没有看到任何与 Cloud Functions 等效的功能。
有没有线索可以避免 Google 实施 Flask 时出现的权限错误?
答案1
权限错误是由 Cloud Functions Python 运行时的异常引起的 - URL 中缺少云函数名称。在 HTML 触发器处访问的页面
http://<region-project>.cloudfunctions.net/function-1/home
包含链接
/static/style.css
似乎有一个文档根目录位于...cloudfunctions.net/
,而不是...cloudfunctions.net/function1/
。
Python请求的网址是...cloudfunctions.net/home
不正确...cloudfunctions.net/function-1/home
的请求路径是/home
代码是否在 Cloud Functions 上运行。
一种解决方法是手动修补所有引用云函数的 URL,以便FUNCTION_NAME
在从模板呈现页面时添加环境变量:
def getenv(name, default):
try:
return os.environ[name]
except KeyError:
return default
def _url(request, path): # Patch URLs to include FUNCTION_NAME if running on GCP
f = getenv('FUNCTION_NAME', '')
return request.url + (f + '/' if f else '') + path
这样,页面将从 Cloud Functions 正确显示,且不会导致权限错误: