[英]404 error when using Google App Engine with flask and flask-restplus
我在根文件夾中的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
我在 flex 環境中運行 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
我嘗試尋找解決方案,但從未找到與我的場景相似的解決方案。
非常感謝這方面的任何幫助。
謝謝你。
您現有的代碼只添加了一個帶有/api
URL 前綴的藍圖,因此它將無法處理/
或/favicon.ico
(許多瀏覽器默認請求)的請求 - 解釋您請求中的前 2 404 錯誤日志。 如果您的應用程序旨在由常規瀏覽器訪問,您可能還需要添加其他藍圖來覆蓋這些 URL,否則這些 404 是預期/正常的。
我不熟悉燒瓶和藍圖,所以我不確定您擁有的藍圖是否應該像現在一樣啟動,已經提供/api/
URL。 如果沒有 - 這將解釋請求日志中的第 3 個 404。 我懷疑您可能需要在藍圖中為其添加路線/規則。
部署到 App Engine 時不會調用您的main
函數。 相反,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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.