如何限制其他用户更新Flask中的数据库对象?

时间:2018-06-22 21:05:51

标签: python-3.x flask flask-sqlalchemy flask-wtforms

我是不熟悉烧瓶和构建票证分配器应用程序的人。生成器端点将始终将系统中最旧的故障单(status = q)分配给登录的人。然后,他将解析(post method = s)故障单,或者可以将其状态更新为“ pending”(post method = p)。

@main.route('/ticket/generator', methods=['GET', 'POST'])
@login_required
def generate_ticket():
    ticket = Ticket.query.filter_by(status='q').order_by(Ticket.create_date).first()
    form = GenerateTicketForm(obj=ticket)
    if form.validate_on_submit():
        ticket.ticket_id = form.ticket_id.data
        ticket.status = form.status.data
        db.session.add(ticket)
        db.session.commit()
        flash('Ticket Status Update Successfully.')
        return redirect(url_for('main.generate_ticket'))
    return render_template('generate_ticket.html', form=form)

当故障单已经分配给某人时,我想更改状态,以便其他人不会获得同一故障单。因此,我创建了一个用于获取最旧票证时更改状态的类方法:

@classmethod
def activate_tkt_flag(cls, ticket_id_, create_date_):
    ticket_db_obj = cls(ticket_id=ticket_id_, create_date=create_date_)
    ticket_in_memory = Ticket.query.get(ticket_db_obj.ticket_id)
    ticket_in_memory.status = 'a'
    db.session.commit()
    return ticket_in_memory 

如果在第一个查询中的ticket对象之后调用它,则以某种方式重写循环并分配新的票证,而忘记了前一个票证,它无法再重写票证,而我得到了错误:Key (ticket_id)=(T5) already exists UPDATE ticket SET ticket_id=%(ticket_id)s, status=%(status)s WHERE ticket.ticket_id = %(ticket_ticket_id)s'] [parameters: {'ticket_id': 'T5', 'status': 's', 'ticket_ticket_id': 'T1'}]。如果有人对如何做有更好的主意,将不胜感激,我有点卡在这里。这是表格的样子。

Form

1 个答案:

答案 0 :(得分:0)

最后,我能够解决它。我只是创建一个端点,该端点首先执行并更新票证状态,并将票证ID传递到下一个端点。因此,最后一个端点显示具有更新状态的票证以呈现html模板。

@main.route('/ticket/generator/<ticket_id>', methods=['GET', 'POST'])
@login_required
def generate_ticket(ticket_id):
    ticket = Ticket.query.get(ticket_id)
    form = GenerateTicketForm(obj=ticket)
    if form.validate_on_submit():
        ticket.ticket_id = form.ticket_id.data
        ticket.status = form.status.data
        db.session.add(ticket)
        db.session.commit()
        # flash('Ticket Status Update Successfully.')
        return redirect(url_for('main.display_status', ticket_id=ticket.ticket_id))
    return render_template('generate_ticket.html', form=form)


@main.route('/ticket/assign')
def assign_ticket():
    ticket = Ticket.query.filter_by(status='q').order_by(Ticket.create_date).first_or_404()
    ticket.status = 'a'
    db.session.commit()
    return redirect(url_for('main.generate_ticket', ticket_id=ticket.ticket_id))

首先执行分配端点,然后将票证ID移交给生成器端点。