仅限本地的 App Engine 标准 Python3 处理程序错误

Posted

技术标签:

【中文标题】仅限本地的 App Engine 标准 Python3 处理程序错误【英文标题】:App Engine Standard Python3 Handler Error Locally Only 【发布时间】:2019-12-15 11:31:43 【问题描述】:

为 App Engine 标准 python 3 运行开发服务器未正确路由请求。

dev_appserver.py app.yaml

app.yaml 文件有 3 个处理程序。

runtime: python37
instance_class: F1

inbound_services:
  - warmup

handlers:
- url: /api/.*
  script: auto
  secure: always
- url: /
  static_files: public/index.html
  upload: public/index.html
  secure: always
- url: /
  static_dir: public
  secure: always

本地对 /api/whatever 的请求都返回 404 错误。 当我将应用部署到 GCP 时,请求成功。

我设置的原因是静态托管 Angular 7 应用程序,同时还托管 Angular 应用程序调用的 API。

由于该问题仅与开发服务器相关,我认为这是一个错误。这里有一个类似的python 2示例:https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/angular/app.yaml

还有其他人遇到过这种情况吗?任何解决方法?

更新:根据 cmets 的要求,这里是一个示例 main.py 文件。

# [START gae_python37_app]
import logging

from flask import request, url_for
from flask_api import FlaskAPI, status, exceptions

# Create flask app
app = FlaskAPI(__name__)

@app.route("/api/whatever", methods=["GET"])
def doSomething():

    response = "message":"placeholder"

    return response
if __name__ == "__main__":
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app.
    app.run(host="127.0.0.1", port=8080, debug=True)
# [END gae_python37_app]

【问题讨论】:

您能否通过提供您的 main.py 文件来提供一个最小的可重现示例?请参阅此处了解更多信息。 ***.com/help/minimal-reproducible-example 【参考方案1】:

更新:我尝试重新创建问题,但 dev_appserver.py 和部署的版本之间似乎确实存在差异。 I have created this issue on Google’s Issue Tracker 由 App Engine 工程团队妥善跟进。

以下答案仅在您的根目录不包含static_dir 路径时有效


问题在于路由的实现方式。我尝试复制您遇到的问题,得到了相同的结果。

就我而言,我可以通过将路由从/api/.* 更改为('/api/<path:path>') 来解决它,因为与该句柄关联的函数将被正确定义为一个包罗万象的1。

请参考提供的代码[2]以及提供的链接1。

1https://flask.palletsprojects.com/en/1.1.x/quickstart/#routing

main.py

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
   """Return a friendly HTTP greeting."""
   return 'Hello World!'


@app.route('/api/<path:path>')
def catch_all(path):
   return 'Hello api page!'`


if __name__ == '__main__':
   # This is used when running locally only. When deploying to Google App
   # Engine, a webserver process such as Gunicorn will serve the app. This
   # can be configured by adding an entrypoint to app.yaml.
   app.run(host='127.0.0.1', port=8080, debug=True)`

app.yaml

runtime: python37

handlers:
- url: /
 script: auto

- url: /api/.*
 script: auto

【讨论】:

您的解决方案不起作用。据我了解,问题的罪魁祸首是 hadler: - url: / static_directory: public secure: always

以上是关于仅限本地的 App Engine 标准 Python3 处理程序错误的主要内容,如果未能解决你的问题,请参考以下文章

App Engine 标准:超时给了我 500 错误

将 Nuxt JS s-s-r 应用程序部署到 Google Cloud App Engine 标准

Google App Engine检查更新

App Engine标准环境中的Python 3快速入门

让 django 的人性化在 App Engine 上工作

Google App Engine 标准 Python 云构建