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 ответ
Я вижу два варианта для вас.
- Используйте predix-webapp-starter с NodeJS в качестве сервера переднего плана. Используйте отдельный микросервис Python в качестве внутреннего сервера. Этот подход может быть лучше, особенно если ваши внутренние процессы SKLearn занимают много времени.
- Запустите все на одном сервере 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