Predix - Полимерный интерфейс для связи с сервером Flask Python? - PullRequest
0 голосов
/ 02 мая 2018

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

manifest.yml * * 1004

---
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, я не получаю «Hello», которое он должен распечатать, я получаю 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 кажется успешным, тот же самый IS работает локально, когда я делаю gulp в папке pacing-app и запускаю ваш python-сервер «вручную» локально.

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

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

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

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

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
0 голосов
/ 04 мая 2018

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

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