【问题标题】:error checking and flashing error messages with FlaskForm使用 FlaskForm 进行错误检查和闪烁错误消息
【发布时间】:2020-03-12 02:12:41
【问题描述】:

我有一个如下设置的表单,最终,我在调试模式下遇到的错误是sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed。我了解原因,但我希望将此错误呈现给用户,以便他们了解问题所在。

class RegistrationForm(FlaskForm):
    company_url = StringField('Company Website', validators=[DataRequired(), URL(message='Must be a valid URL')])
    password = PasswordField(
        'Password', validators=[DataRequired(), EqualTo('pass_confirm',
                                                        message='Passwords must match')]
    )
    pass_confirm = PasswordField('Confirm Password', validators=[DataRequired()])
    submit = SubmitField('Register!')

但是,当在表单中输入错误的 URL 结构并提交时,我无法让它在 html 页面中为用户显示错误消息。 html页面如下。我也会把base.html放在下面。

{% extends "base.html" %}
{% block content %}
    <form method="POST">
        {{form.hidden_tag()}}
        {{form.company_url.label}}{{form.company_url()}}<br>
        {{form.password.label}}{{form.password()}}<br>
        {{form.pass_confirm.label}}{{form.pass_confirm()}}<br>
        {{form.submit()}}
    </form>
{% endblock %}
<!DOCTYPE html>
<html>
  <head>
   ...some code here
  </head>
  <body>
    <!-- Just an image -->
<nav class="navbar navbar-dark bg-dark">
  <span class="align-bottom text-light">Creating connections, saving time</span>
</nav>

    {% with messages = get_flashed_messages() %} {% if messages %} {% for
    message in messages %}
    <div class="alert alert-warning alert-dismissible" role="alert">
      <button
        type="button"
        class="close"
        data-dismiss="alert"
        aria-label="Close"
      >
        <span aria-hidden="true">×</span>
      </button>
      {{message}}
    </div>
    {% endfor %} {% endif %} {% endwith %} {% block content %} {% endblock %}
  </body>
</html>

views.py 是:

@app.route('/register', methods=['GET', 'POST'])
def register():

    form = RegistrationForm()

    if form.validate_on_submit():
        user = Buyers(
            company_url=form.company_url.data,
            password=form.password.data
        )

        db.session.add(user)
        db.session.commit()
        flash("Thank you for registering.")
        return redirect(url_for('login'))

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

如何处理表单中的错误以确保用户知道他们输入的 URL 结构不正确?我处于调试模式,现在 register.html 页面基本上只是重新加载,没有任何关于原因的消息。谢谢!

【问题讨论】:

    标签: python-3.x flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    views.py:

    import validators
    
    @app.route('/register', methods=['GET', 'POST'])
    def register():
    
        form = RegistrationForm()
    
        if form.validate_on_submit():
            isUrlValid=validators.url(form.company_url.data)
            if isUrlValid==True:
                user = Buyers(
                    company_url=form.company_url.data,
                    password=form.password.data
                )
                db.session.add(user)
                db.session.commit()
                flash("Thank you for registering.")
                return redirect(url_for('login'))
            else:
                flash("URL is not valid. Please enter a valid URL")
                return redirect(url_for('register'))
    
        return render_template('register.html', form=form)
    

    【讨论】:

    • 非常感谢您提供这些信息。我确实尝试了您建议的代码,但仍然无法让它闪烁消息。奇怪的是,然后我正确注册,消息“谢谢您注册”工作正常。感谢您的帮助。
    • 你可以放一个简单的显示来检查如果 URL 无效,条件是否被调用。并在调试日志中检查。
    • 非常感谢。就这样我明白了,我将如何编写显示?我以前没有这样做过。谢谢。
    • else: print("url is not valid") flash("URL is not valid. please enter a valid URL") return redirect(url_for('register'))
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2020-01-18
    • 2018-06-14
    • 2015-12-08
    • 2017-09-03
    • 2017-03-19
    相关资源
    最近更新 更多