【发布时间】:2021-03-21 02:54:11
【问题描述】:
我正在尝试在 Google App Engine 上设置服务,但无法让 XmlHttp 与它一致地工作。
部署后,可以从2个不同的url访问网站:service-dot-project.appspot和version-dot-service-dot-project.appspot,由于某种原因,两者之间存在不一致。
这里有一些可验证给我带来麻烦的演示代码。
# routes.py
from flask import render_template
from . import app
@app.route("/test", methods=["GET"])
def test():
return render_template("test.html")
@app.route("/api/test", methods=["GET"])
def api_test():
return "It Works!"
# templates/test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Debug</title>
</head>
<body>
<div id="out"></div>
<button type="button" onclick="run()">
Test the thing.
</button>
<script>
function run() {
let xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = () => {
if (xmlHttp.readyState === 4 && xmlHttp.status === 200)
document.getElementById("out").innerText = xmlHttp.responseText;
}
xmlHttp.open("GET", "/api/test", true);
xmlHttp.send(null);
}
</script>
</body>
</html>
# service.yaml
runtime: python38
service: name
automatic_scaling:
min_idle_instances: 1
instance_class: F4
entrypoint: gunicorn -b :$PORT main:app
env_variables:
...
当我尝试按下版本网址上的按钮时,它按预期工作,并且“它工作!”打印到按钮上方的 div 中,但在服务 url(未指定版本)上,页面本身会加载,但按下按钮会导致请求挂起几秒钟,然后再将其打印到控制台:
GET https://service-dot-project.appspot.com/api/test [HTTP/2 404 Not Found 7912ms]
使用本地flask调试环境进行测试时,不会出现问题。
我应该知道 Google App Engine 所做的哪些事情可能会导致此问题发生? /api 是保留端点吗?我的其余端点在服务 url 上工作,它只有 api 端点中断。我唯一的 app.before_request 方法因 403 而失败,而不是 404,所以这不是原因。
【问题讨论】:
-
xmlHttp是否会发生这种情况,或者如果您直接提出请求,您是否会得到相同的行为,例如通过curl?curl -I https://service-dot-project.appspot.com/api/test的输出是什么? -
在浏览器中打开
/api端点具有相同的效果。在版本 URL 上,它按预期工作,但在服务 URL 上,它没有......如果我在 curl 或 postman 中打开,由于 Google IAP,我会立即点击登录屏幕。
标签: javascript python google-app-engine flask