[英]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.