Python - flask - 闪烁的消息被跳过(不显示),webserver立即返回响应

时间:2018-04-08 05:36:02

标签: python flask

我对Python烧瓶和网络服务器概念一般都很陌生,但已设法创建一个简单的webapp。

它基本上包含一个主页,其中包含要填写的表单和一个提交按钮,在以下情况下返回闪烁的消息: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

Flash消息按预期工作但在我添加return_results()路径后,在填写表单(无论是完整还是不完整)后,它会直接转到/results

你能告诉我在这里缺少什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该在模板文件中呈现Flash消息。在模板中添加以下代码片段,以便显示Flash消息或布局模板文件:

{% 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而不使用flash消息;

2)如果请求方法是post并且表单数据通过验证,则呈现 result.html成功的flash消息;

3)如果请求方法已发布但表单数据未通过验证,请使用失败的Flash消息再次呈现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)