POST запрос с Frozen Flask - PullRequest
       12

POST запрос с Frozen Flask

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

Просматривая примеры в Интернете, кажется, что можно использовать формы с запросами POST внутри stati c сайтов, созданных с использованием ванильного HTML / CSS / JS. Но я не могу сделать это с Flask. Я использую библиотеку Frozen- Flask .

Мой основной скрипт server.py находится ниже (model и encoder правильно загружены вверху файла)

app = Flask(__name__)
app.config['FREEZER_RELATIVE_URLS'] = True

@app.route('/')
def main():
    return render_template("index.html")

@app.route('/predict', methods=["POST"])
def predict():
    if request.method == "POST":
        message = request.form['submission'] # gets submission
        prediction = model.predict([message]) # feeds to model
        classification = encoder.inverse_transform(prediction) # decodes prediction

        return render_template('index.html', message=message, classification=classification)

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

Так же как и мой freeze.py скрипт:

from flask_frozen import Freezer
from server import app

freezer = Freezer(app)

if __name__ == '__main__':
    freezer.freeze()

Наконец, соответствующая часть моего index.html:

<form class="form-group" action="{{ url_for('predict') }}" method="POST">
    <textarea class="form-control" name="submission" id="submission" rows="10"></textarea> 
    <button type="submit" class="btn btn-primary">Classify</button>
</form>

Если я запускаю python server.py, он же обычный Flask, сайт работает нормально. Он загружается в http://localhost:5000/, и нажатие кнопки «Классифицировать» приводит меня к http://localhost:5000/predict/, с классификацией, показанной на экране.

Когда я запускаю python freeze.py, он же Frozen- Flask, чтобы генерировать данные c веб-сайт, я сталкиваюсь с ошибками.

$ python freeze.py
Traceback (most recent call last):
  File "freeze.py", line 11, in <module>
    freezer.freeze()
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in freeze
    return set(page.url for page in self.freeze_yield())
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 199, in <genexpr>
    return set(page.url for page in self.freeze_yield())
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 183, in freeze_yield
    new_filename = self._build_one(url)
  File "C:\Users\User\Documents\Projects\Spam Classifier\spam-classifier-hoohacks-starter\env\lib\site-packages\flask_frozen\__init__.py", line 322, in _build_one
    % (response.status, url))
ValueError: Unexpected status '405 METHOD NOT ALLOWED' on URL /predict/

Что я сделал, чтобы исследовать / попытаться решить эту проблему: ошибка 405 указывает, что HTTP-запрос, отличный от POST, вызывается по предикту. Так что для целей тестирования я changed methods=["POST"] до methods=["GET"]. И затем я сделал свою страницу предсказания просто визуализирующей нормальную главную страницу.

@app.route('/predict/', methods=["GET"])
def predict():
    return render_template("index.html")

Запуск сценария остановки больше не выдает ошибку. Веб-сайт существует на .../build/index.html, и нажатие кнопки "Классифицировать" переводит меня на .../build/predict/index.html. Но страница прогноза бесполезна, поскольку она такая же, как и главная страница.

Я предполагаю, что Frozen- Flask должен иметь GET доступ к страницам для создания их версий c, но я не могу также быть в состоянии обновить эти страницы с предоставленной POST информацией? Или не может выполнить эту часть определения "stati c"

1 Ответ

1 голос
/ 01 мая 2020

Из того, что я вижу из кода, Frozen- Flask использует метод GET test_client для получения содержимого для каждой генерируемой страницы. Таким образом, вы не сможете использовать POST без взлома Frozen- Flask.

С другой стороны, запросы GET могут включать параметры URL:

/predict?message=123456

Таким образом, вы можете получить свой параметры, подобные этому:

request.args.get('message', '')

Теперь имейте в виду, что Forozen- Flask не знает, что отправлять в качестве аргументов. Так что я бы сделал что-то вроде этого:

    @app.route('/predict', methods=["GET"])
    def predict():
        message = "some message" # hardcode a value
        prediction = model.predict([message]) # feeds to model
        classification = encoder.inverse_transform(prediction) # decodes prediction

        return render_template('index.html', message=message, classification=classification)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...