Predix - Полимерный интерфейс для связи с сервером Flask Python?

Я пытаюсь отправить в Cloudfoundry программу, содержащую 2 приложения - сервер Flask для запуска Python API и приложение Polymer для внешнего интерфейса. В настоящее время я использую следующую структуру:

manifest.yml:

---
applications:
  - name: flask_min
    path: ./flask_min
    buildpack: https://github.com/cloudfoundry/python-buildpack 
    memory: 512M
  - name: pacing_app
    memory: 512M
    buildpack: nodejs_buildpack
    command: node server/app.js
    path: ./pacing_app/build/es5-basic

А потом в папку ./flask_min у меня есть Procfile:

web: python3 app.py

а также app.py имеет сервер Flask (плюс декоратор для CORS для локального тестирования, который я для краткости опускаю):

app = Flask(__name__)

port = int(os.getenv("PORT", 7733))

@app.route('/hello', methods=['GET', 'OPTIONS'])
@crossdomain(origin='*')
def hello():
    return "Hello"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)

Я могу cf push это, и экземпляры появляются бегом. Однако, когда я захожу на URL-адрес приложения flask_min, я не получаю "Привет", который он должен распечатать, я получаю HTTP ERROR 503,

Что касается pacing_app, я использую Predix Webapp Starter, за исключением того, что я удалил элементы в seed-app.html и просто заменил его вызовом API:

<template>
  <iron-ajax url="http://localhost:7733/hello" handle-as="text" last-response="{{data}}" auto></iron-ajax>        
    <p>{{data}}</p>
</template>

Локально это работает, однако на Predix это не так. Первый вопрос: как я могу ссылаться на Flask API, когда он на Predix?

Кроме того, несмотря на то, что все работает локально, интерфейс Polymer также не будет загружаться в Predix. Я тоже получаю

Не удалось загрузить ресурс: сервер ответил со статусом 503 (служба недоступна)

Хотя cf push кажется успешным, то же самое работает локально, когда я делаю gulp в pacing-app папку и запустить свой сервер Python "вручную" локально.

Ты знаешь, что я делаю не так? Как настроить интерфейс Polymer с компонентами Predix, использующими API-интерфейс Python, также работающий в Predix?

Я не настроен на использование двух отдельных приложений, я просто не знаю, как это сделать с одним приложением. Я бы предпочел, чтобы приложение Polymer работало на сервере NodeJS, а не обслуживало его из Flask из-за производительности, а сервер Python/Flask важен, потому что я намереваюсь запустить некоторый код SKLearn в фоновом режиме.

1 ответ

Я вижу два варианта для вас.

  1. Используйте predix-webapp-starter с NodeJS в качестве сервера переднего плана. Используйте отдельный микросервис Python в качестве внутреннего сервера. Этот подход может быть лучше, особенно если ваши внутренние процессы SKLearn занимают много времени.
  2. Запустите все на одном сервере Python/Flask. Вы можете посмотреть на приложение Predix Digital Volcano в качестве примера. Этот подход может быть проще, если у вас больше опыта работы с Python.

Комбинация полимера и колбы требует некоторой "настройки", чтобы сервер колбы служил правильной папке полимера... Начиная с простого колб-сервера, как показано ниже:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return app.send_static_file('index.html')

@app.route('/<path:the_path>')
def all_other_routes(the_path):
    return app.send_static_file(the_path)

if __name__ == '__main__':
    app.run(debug=True)

и используя полимерный стартовый набор в новой папке:

mkdir polymer && cd polymer && polymer init polymer-3-starter-kit && polymer build && cd ..

Затем вам нужно либо изменить папку для подачи колб по умолчанию (статическую), либо вы можете просто создать символическую ссылку на вашу папку для сборки полимера. Я предпочитаю делать второе, выполнив следующую команду в корневом каталоге (рядом с файлом вашего сервера):

ln -s ./polymer/build/es6-bundled ./static
Другие вопросы по тегам