仅限本地的 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 处理程序错误的主要内容,如果未能解决你的问题,请参考以下文章