flask - Flask wtforms 检查用户名是否已经存在/闪烁错误
问题描述
我有一个按预期工作的基本注册/登录。我遇到的问题是,我无法弄清楚如何检查用户名是否已在使用,然后闪现一条消息。
我的路线
@app.route("/signup", methods=['GET', 'POST'])
def signup():
form = RegisterForm()
if form.validate_on_submit():
hashed_password = generate_password_hash(form.password.data, method='sha256')
new_user = User(username=form.userName.data, email=form.email.data, password=hashed_password)
db.session.add(new_user)
db.session.commit()
flash("Registration successful...please log in!")
return redirect(url_for('login'))
return render_template("signup.html", form=form)
我的用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True)
email = db.Column(db.String(50), unique=True)
password = db.Column(db.String(80))
我的 HTML(错误 div)
{% for field, errors in form.errors.items() %}
<div class="alert alert-error">
{{ form[field].label }}: {{ ', '.join(errors) }}
</div>
{% endfor %}
解决方案
一种可能性是编写一个自定义验证器,该验证器在数据库中查询已存在的具有该名称的用户,如果查询成功则抛出错误。
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired
from wtforms.validators import ValidationError
class RegisterForm(FlaskForm):
# ...
username = StringField(
'Username',
validators=[
DataRequired(),
# ...
])
# ...
def validate_username(self, field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username already in use.')
推荐阅读
- python - 数据框样本熊猫的平均值
- swift - 如何使节点移动到您在 SpriteKit 中触摸屏幕的位置
- python - python中表格的计算问题。(简单的销售税计划)
- node.js - 'CALL "C:\Program Files\nodejs\\node.exe" 不被识别为内部命令或外部、可执行程序或命令文件
- python - 在 Scrapy 中抓取/使用 cookie
- c# - 如何将选中的列表框绑定到 C# 中的组合框?
- python - 如何更改 tkinter 标签文本以显示按键信息?
- python - 文件中不同顺序的python数字
- reactjs - 仅将 CSS 样式应用于树数据中的最后一行
- vb.net - 为另一个子禁用 Richtextbox 中的箭头键