[英]Validate current_user if it is already in DB
我无法显示验证错误,只有来自 SQLAlchemy 的 IntegrityError
(sqlalchemy.exc.IntegrityError:(sqlite3.IntegrityError)唯一约束失败:Booking.username)。
我在 DB 中有两张表,一张是注册用户列表,另一张是登录用户列表,他们可以通过 FlaskForm 和 RadioFields 预订时间。 我认为我在这个函数中有错误def validate_booking (self)
我需要检查 current_user 是否已经预订了时间,然后他不能再预订
我将验证功能移到了 LoginForm 中,这似乎有效。 它在用户跳转到下一个预订页面之前进行验证。 不过,这并不完全是我想要在预订页面上进行验证的方式。
模型.py
class User(db.Model, UserMixin):
__tablename__ = 'Employees'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
code = db.Column(db.String(20), nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.code}')"
class Book(db.Model, UserMixin):
__tablename__ = 'Booking'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
choice = db.Column(db.String(30), nullable=False)
def __repr__(self):
return f"Book('{self.username}, '{self.choice}')"
表格.py
class LoginForm(FlaskForm):
username = StringField('Name', validators=[DataRequired(), Length(min=2, max=20)])
code = StringField('Code', validators=[DataRequired()])
submit = SubmitField('Book time')
def validate_username(self, username):
user = Book.query.filter_by(username=username.data).first()
if user:
raise ValidationError('You have registered your car today')
class BookingForm(FlaskForm):
book = RadioField('Label', choices=[('Station_1_morning', '07:00-11:00'), ('Station_1_afternoon', '11:00-15:00'),
('Station_2_morning', '07:00-11:00'), ('Station_2_afternoon', '11:00-15:00'),
('Station_3_morning', '07:00-11:00'), ('Station_3_afternoon', '11:00-15:00')],
coerce=str, validators=[InputRequired()])
submit = SubmitField('Register time')
路线.py
@app.route("/booking", methods=['POST', 'GET'])
@login_required
def booking():
session.permanent = True
app.permanent_session_lifetime = timedelta(seconds=5)
form = BookingForm()
if form.validate_on_submit():
book = Book(username=current_user.username, choice=form.book.data)
db.session.add(book)
db.session.commit()
flash('Your time is registered', 'success')
return render_template('booking.html', title='Booking', form=form)
我没有看到错误。 您可以在验证功能中添加print (user)
以查看其中的内容。
无论如何,这仍然存在竞争条件:如果同一用户在检查(“验证”)和提交之间的另一个请求中预订。 作为一般规则,我宁愿尝试提交并捕获完整性错误。 从完整性错误异常对象构建有意义的消息可能有点棘手(我的意思是从对象中获取违规字段的名称)。 当然,如果您确定只有一个约束适用,您可以对消息进行硬编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.