Как получить ответ от приложения Flask с помощью curl?

Я создаю предсказатель теста Flask, используя AllenNLP.

Я передаю предсказателю «переход» и «вопрос» из файла .json.

Однако, когда я передаю файл json с помощью curl, он не возвращает ответ. Есть ли во Flask специальный возврат за его получение?

Код выглядит так:

 from allennlp.predictors.predictor import Predictor as AllenNLPPredictor


from flask import Flask
from flask import request
app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def hello():
    return "<h1>Test app!</h1>"


class PythonPredictor:
    def __init__(self, config):
        self.predictor = AllenNLPPredictor.from_path(
            "https://storage.googleapis.com/allennlp-public-models/bidaf-elmo-model-2018.11.30-charpad.tar.gz"
        )

    def predict(self, payload):
        if request.method == "POST":
            prediction = self.predictor.predict(
                passage=payload["passage"], question=payload["question"]
            )
            return prediction["best_span_str"]

Команда curl выглядит так: curl http://127.0.0.1:5000 -X POST -H "Content-Type : application / json "-d @ sample.json


person Doug    schedule 01.04.2020    source источник
comment
Похоже на неправильный URL. Вы можете попробовать http://127.0.0.1:5000/predict   -  person v25    schedule 02.04.2020
comment
Спасибо за этот улов. Это была просто опечатка в моем локоне, когда я пробовала другой путь. Я отредактировал это сейчас. Если посмотреть на маршрут сейчас, все под /.   -  person Doug    schedule 02.04.2020


Ответы (1)


Если я не неправильно понял (я предполагаю, вы спрашиваете, как получить представление JSON в своем маршруте и вернуть результат), похоже, вам нужно сделать что-то вроде:

p = PythonPredictor()

@app.route("/", methods=['POST'])
def hello():
    data = request.get_json()
    result = p.predict(data)
    return result

Это эффективно обрабатывает данные в вашем sample.json через ваш PythonPredictor.predict метод и возвращает этот прогноз клиенту.

Обратите внимание, что этот код создает экземпляр p вне функции маршрута, так что модель NLP загружается только при запуске вашего флеш-приложения (не при каждом запросе). Однако похоже, что это может повторно загрузить этот файл, если AllenNLPPredictor.from_path не выполнит какое-либо кеширование, поэтому, вероятно, было бы целесообразно сначала вручную загрузить этот файл в свое собственное хранилище и загрузить оттуда в функции PythonPredictor.__init__.

Сообщите мне, если что-то из этого требует разъяснения, или я неправильно понял.

person v25    schedule 02.04.2020
comment
Большое спасибо @ v25. Это было именно то. Я думаю, что в целом мне не хватало концепции, предоставленной вашим фрагментом кода. Чтобы загрузить модель в PythonPredictor init, есть ли у вас ссылка, по которой я могу изучить, как загрузить ее с моего собственного сервера (размещенного в лазурном режиме)? - person Doug; 02.04.2020
comment
Отличный ответ, большое спасибо за то, что поделились своим мнением. Это тоже мне очень поможет - person Aar Man; 28.01.2021