我的 main.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
我在弹性环境中运行GAE。
我遵循了https://cloud.google.com/appengine/docs/flexible/python/quickstart中的步骤,并能够成功地将应用程序部署到应用程序引擎。
当我转到appspot链接时,出现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
我尝试寻找一种解决方案,但从未找到与我的情况类似的解决方案。
对此有任何帮助。
谢谢。
答案 0 :(得分:2)
您现有的代码仅添加了一个带有/api
URL前缀的蓝图,因此它将无法处理对/
或/favicon.ico
的请求(许多浏览器默认请求) )-说明请求日志中的前2404个错误。如果打算让常规浏览器访问您的应用,则您可能还希望添加其他蓝图来覆盖这些URL,否则,这些404是预期的/正常的。
我对烧瓶和蓝图不熟悉,所以我不确定是否应该按照目前的方式启动蓝图,并且已经提供了/api/
URL。如果不是,那将解释请求日志中的第3个404。我怀疑您可能需要在蓝图中为此添加一条路线/规则。
答案 1 :(得分:1)
部署到App Engine时不会调用您的main
函数。相反,App Engine使用Gunicorn和您在entrypoint
文件中定义的app.yaml
。
由于未调用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)