簡體   English   中英

如果 current_user 已經在數據庫中,則驗證它

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM