【问题标题】:404 error when using Google App Engine with flask and flask-restplus将 Google App Engine 与 flask 和 flask-restplus 一起使用时出现 404 错误
【发布时间】:2019-02-13 22:19:03
【问题描述】:

我在根文件夹中的 ma​​in.py 文件如下所示。

app = Flask(__name__)

def configure_app(app):
    app.config['SERVER_NAME'] = settings.FLASK_SERVER_NAME
    app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
    app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE
    app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER
    app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP

def initialize_app(app):
    configure_app(app)
    blueprint = Blueprint('api', __name__, url_prefix='/api')
    api.init_app(blueprint)
    api.namespaces.pop(0) #this is to remove default namespace from swagger doc
    api.add_namespace(user_namespace)
    app.register_blueprint(blueprint)

def main():
    initialize_app(app)
    app.run(debug=settings.FLASK_DEBUG)


if __name__ == "__main__":
    main()

我的 app.yaml 文件如下所示。

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
  python_version: 3

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

下面是 requirements.txt 文件。

Flask==1.0.2
flask-restplus==0.11.0
gunicorn==19.9.0

我在 flex 环境中运行 GAE。

我按照https://cloud.google.com/appengine/docs/flexible/python/quickstart 中的步骤操作,成功将应用部署到应用引擎。

当我转到 apppot 链接时,我收到 404 错误,并且 gcloud 日志尾部如下所示。

2018-09-09 01:49:00 default[20180909t113222]  "GET /" 404
2018-09-09 01:49:01 default[20180909t113222]  "GET /favicon.ico" 404
2018-09-09 01:49:09 default[20180909t113222]  "GET /api/" 404

我尝试寻找解决方案,但从未找到与我的情况类似的解决方案。

非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: python google-app-engine google-cloud-platform flask-restplus


    【解决方案1】:

    您的 main 函数在部署到 App Engine 时不会被调用。相反,App Engine 使用 Gunicorn 和您在 app.yaml 文件中定义的 entrypoint

    由于main 没有被调用,您的initialize_app 函数也没有被调用,这正在添加您正在寻找的端点。

    相反,您应该执行以下操作:

    app = Flask(__name__)
    initialize_app(app)
    
    def configure_app(app):
        ...
    
    def initialize_app(app):
        ... 
    
    if __name__ == "__main__":
        # Only use this for things need to run the app locally,
        # will not be used when deploying to App Engine
        app.run(debug=settings.FLASK_DEBUG)
    

    编辑:我能够使用这个最小的main.py

    from flask import Flask, Blueprint
    from flask_restplus import Api
    
    app = Flask(__name__)
    api = Api()
    blueprint = Blueprint('api', __name__, url_prefix='/api')
    api.init_app(blueprint)
    app.register_blueprint(blueprint)
    

    【讨论】:

    • 感谢 Dustin 的回复,我试过了,还是不行,但是,当我点击 /api/ 时出现 404 错误。
    • @NadunPerera 查看我的编辑,我可以使用最小的 main.py 文件来完成这项工作,也许可以从那里开始并添加回原始文件的其余部分以查看它停止工作的位置。跨度>
    • 非常感谢,这行得通!问题在于configure_app(app),我在设置文件中将SERVER_NAME 设置为使用localhost:8080。从设置文件中删除它后,服务器默认恢复为localhost:5000,它在 GAE 中没有任何问题。
    【解决方案2】:

    您现有的代码只添加了一个带有 /api URL 前缀的蓝图,因此它将无法处理对 //favicon.ico 的请求(许多浏览器默认请求) - 解释前 2您的请求日志中出现 404 错误。如果您的应用旨在由常规浏览器访问,您可能还需要添加其他蓝图来覆盖这些 URL,否则这些 404 是预期/正常的。

    我不熟悉烧瓶和蓝图,所以我不确定您拥有的蓝图是否应该按照目前的方式启动,已经提供/api/ URL。如果不是 - 这将解释请求日志中的第 3 个 404。我怀疑您可能需要在蓝图中为其添加路由/规则。

    【讨论】:

    • 感谢您的回复。是的,我了解前 2 404 个,这是由于前缀 /api。对于令人困惑的解释,我深表歉意。我已经在我的 localhost 中测试了该应用程序,当您点击 localhost:8080/api 时它可以正常工作。只是当我将应用程序推送到 GAE 时,它似乎不起作用。
    • 注意/api(你提到你在本地尝试过的)和/api/在GAE日志中的区别。它们通常不一样。也可以试试localhost:8080/api/
    • 是的,我可以在我的本地主机上点击 /api 或 /api/ 并且它可以工作。感谢您的回复丹。
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2015-08-14
    • 2020-01-08
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多