python - 如何从 FlaskWTF 的 View 中以自定义方式引发字段错误

标签 python sqlite flask wtforms

我有一个由类(class)创建的注册表:

class RegistrationForm (Form):
   username = StringField('username', validators = [DataRequired()])

和模型:

class User (db.Model):
    UserName = db.Column(db.String(25),nullable=False, unique=True)

我想检查服务器中的用户名字段是否重复,然后返回该字段的错误...是否可以不使用闪存消息?

因为我使用宏 formhelper 在包含错误的字段旁边显示字段错误..

或者有没有办法指定该字段在验证器中是唯一的?

谢谢:

宏:

{% macro render_field(field) %}
  {{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul>
    {% for error in field.errors %}
      <li style="color:red">{{ error }}</li>
    {% endfor %}
        <li style="color:red">{{ error_message }}</li>
    </ul>
  {% endif %}
{% endmacro %}

最佳答案

在表单上定义方法“validate_<字段名称>”。这将运行您想要的任何自定义验证。在这种情况下,检查用户名是否已被使用,如果是则引发错误。

from flask_wtf import Form
from wtforms.fields import StringField
from wtforms.validators import ValidationError, InputRequired

class RegistrationForm(Form):
    username = StringField('username', validators=[InputRequired()])

    def validate_username(self, field):
        # count the number of user ids for that username
        # if it's not 0, there's a user with that username already
        if db.session.query(db.func.count(User.id)).filter_by(username=field.data).scalar():
            raise ValidationError('this username is already taken')

作为一种优化,这会计算 id 字段,而不是实际获取或计算整个模型。

请参阅WTForms docs了解更多信息。

<小时/>

请注意,有些人认为这是一个安全问题,因为攻击者可以通过在此处尝试并查看是否失败来确定名称是否已注册。

关于python - 如何从 FlaskWTF 的 View 中以自定义方式引发字段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556449/

相关文章:

python - 在 Python 中从 txt 文件创建新的 sqlite 数据库表

python-2.7 - 如何 "dockerize"Flask 应用程序?

python - ast.literal_eval() 格式错误的节点或字符串,同时使用 array()s 列表转换字符串

sqlite - 如何打开位于 sqlite3 中特定文件夹中的数据库文件?

c# - 是否可以用 C# 以外的语言实现属性?

android - Android应用开发时持久化数据比较常用的是什么?

python - WTForms Selectfield - 如何只获取特定列的值?

python - 在 GCE 实例上运行 Web 应用程序

python - 如何用matplotlib控制彩色图像渲染?

python - pyinstaller生成的exe文件不能在别人的电脑上使用