Python - фляга - флэш-сообщения пропускаются (не отображаются), и веб-сервер сразу возвращает ответы

avatar
billydh
8 апреля 2018 в 05:36
341
1
-1

Я новичок в Python flask и концепции веб-сервера в целом, но мне удалось создать простое веб-приложение.

В основном он состоит из домашней страницы с формой для заполнения и кнопкой отправки, которая возвращает мигающие сообщения, когда: 1) все поля заполнены правильно и 2) не все поля заполнены.

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

@app.route('/', methods = ['GET', 'POST'])
def home():
    form = preference_form(request.form)

    print(form.errors)
    if request.method == 'POST':
        name = request.form['name']
        age = request.form['age']
        address = request.form['distance']
        date = request.form['date']

        if form.validate():
            flash('All good!')
        else:
            flash('Oops! All details are required to provide accurate results!')

    return render_template('home.html', form = form)

@app.route('/results', methods = ['POST'])
def return_results():
    name = request.form.get('name')
    age = request.form.get('age')
    address = request.form.get('address')
    result = function_a(name=name,
                  age=age,
                  address=address)
    return result

Флэш-сообщения работали как надо, но после того, как я добавил маршрут return_results(), после заполнения формы (полной или неполной) я попал прямо на /results.

Не могли бы вы сказать мне, что я здесь упускаю?

Спасибо!

Источник

Ответы (1)

avatar
stamaimer
8 апреля 2018 в 05:57
1

Вы должны визуализировать свои флеш-сообщения в файле шаблона. Добавьте следующий фрагмент кода в свой шаблон, который вы хотите отображать во всплывающих сообщениях или файле шаблона макета:

{% with messages = get_flashed_messages() %}
  {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
      <li>{{ message }}</li>
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}

ОБНОВЛЕНИЕ: одна функция просмотра с тремя путями выполнения удовлетворит ваши потребности.

1) если используется метод запроса get, просто визуализируйте home.html без мгновенного сообщения;

2) если метод запроса является почтовым и данные формы проходят проверку, отобразить result.html с сообщением об успешном выполнении;

3) если метод запроса является почтовым, но данные формы не проходят проверку, снова визуализируйте home.html с ошибочным флеш-сообщением.

@app.route('/', methods=["GET", "POST"]
def index():
    form = PreferenceForm()
    if request.method == "POST":
        if form.validate_on_submit():
            flash("success.")
            result = func(age=form.age.data, 
                          date=form.date.data, 
                          name=form.name.data, 
                          address=form.address.data)
            return render_template("result.html", result=result)
        else:
            flash("failed!")       
    return render_template('home.html', form=form)
billydh
8 апреля 2018 в 06:17
0

У меня есть что-то подобное в моем шаблоне. Как я упоминал в своем вопросе, до того, как я добавил функцию return_results(), флэш-сообщения возвращались, как и ожидалось, но не после того, как я добавил эту функцию.

stamaimer
8 апреля 2018 в 06:18
0

Ваша функция просмотра return_results ничего не показала.

stamaimer
8 апреля 2018 в 06:24
0

И вы не отрендерили в нем файл шаблона.

billydh
8 апреля 2018 в 06:36
0

Вы предлагаете поместить строки, где он проверяет форму и возвращает флэш-сообщения в home() вместо return_results()? И если это так, то, конечно, требуется добавить рендеринг файла шаблона в return_results()?

stamaimer
8 апреля 2018 в 08:30
0

Все зависит от вашего дизайна вашего приложения. Если мы можем закончить сбор информации в одной функции представления (конечная точка), зачем нам вторая (/resutls).

billydh
9 апреля 2018 в 03:41
0

как я уже упоминал, мои знания об этом ограничены, и мое обоснование наличия другой конечной точки заключается в том, что я представляю что-то вроде поиска Google, после того как я отправлю свой поисковый запрос, он вернет новую страницу, содержащую результаты.

stamaimer
9 апреля 2018 в 04:08
0

@ user7799677 Я обновил свой ответ. Вы можете завершить свою функцию только с одной функцией просмотра.