Flask API работает для GET, но не для методов POST (heroku) - PullRequest
0 голосов
/ 16 апреля 2020

Я запускаю очень спартанское приложение для машинного обучения, которое структурировано так:

app.py:

from flask import Flask, request, jsonify
import pandas as pd
from joblib import load

app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def predict():
    df = pd.DataFrame(request.json)
    df = df.reindex(columns=feature_columns, fill_value=0)
    prediction = list(ada.predict(df))
    return jsonify({"prediction": int(prediction[0])})

@app.route('/test', methods=['GET'])
def test():
    return "get successful"

if __name__ == '__main__':
    ada = load("./model/adaboost_model")
    feature_columns = load("./model/feature_columns")
    app.run()

needs.txt :

Flask
gunicorn
pandas
joblib

Procfile :

web: gunicorn -b :$PORT app:app

и модель / папка, содержащая две маринованные модели Adaboost.

Я развернул это на Heroku, конечная точка GET on / test работает нормально, приложение работает нормально, возвращает 404 для случайных запросов и распознает, что / прогнозирование имеет только метод POST. Однако, когда я запускаю POST, я получаю Внутреннюю ошибку сервера, я уверен, что это не фактический код метода POST, который вызывает проблемы, потому что простой метод POST, который я написал для тестирования, также терпит неудачу, и он не делает ничего связанного с кодом.

Локально это работает отлично, проверено почтальоном, вывод правильный и все. Что может быть не так с запросами POST при развертывании на Heroku?

1 Ответ

0 голосов
/ 16 апреля 2020

Таким образом, проблема, похоже, связана с gunicorn и кодом, который запускается до app.run(), переводит загрузку столбцов модели и элементов в фактический метод POST predict(), теперь работает отлично.

Однако это не оптимально, потому что каждый раз, когда делается запрос POST, вам нужно снова загружать модель, но это работает и не так уж и плохо, потому что я буду использовать этот метод POST только один раз в час или около того.

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