Ошибка 404 при использовании Google App Engine с flask и flask-restplus - PullRequest
0 голосов
/ 09 сентября 2018

Мой 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

Ниже приведен файл needs.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

Я пытался найти решение, но так и не нашел того, которое соответствует моему сценарию.

Любая помощь в этом очень ценится.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Ваша функция main не будет вызываться при развертывании в App Engine. Вместо этого 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)
0 голосов
/ 09 сентября 2018

Ваш существующий код добавляет только один проект с префиксом URL-адреса /api, поэтому он не сможет обрабатывать запросы на / или /favicon.ico (которые по умолчанию запрашивают многие браузеры), объясняя первые 2 404 ошибки в вашем журнале запросов. Если ваше приложение предназначено для посещения обычными браузерами, вы можете добавить другие чертежи, чтобы охватить и эти URL, в противном случае эти 404 ожидаются / нормальные.

Я не знаком с флягой и чертежами, поэтому я не уверен, должен ли ваш проект, инициированный в том виде, в каком он есть сейчас, уже обслуживать URL-адрес /api/. Если нет - это объясняет 3-й 404 в журнале запросов. Я подозреваю, что вам может понадобиться добавить маршрут / правило для него в план, tho.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...