簡體   English   中英

將 Google App Engine 與 Flask 和 Flask-restplus 一起使用時出現 404 錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM