【问题标题】:how to restrict other user from updating an db object in Flask?如何限制其他用户更新 Flask 中的数据库对象?
【发布时间】:2018-06-22 21:05:51
【问题描述】:

我是烧瓶和构建票证分配器应用程序的新手。生成器端点将始终将系统中最旧的票证(状态 = q)分配给登录的人。然后他将解析(发布方法 = s)票证,或者可以将其状态更新为待处理(发布方法 = 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'}]。如果有人有更好的想法如何做到这一点,我将不胜感激,我有点卡在这里。这是表格的样子。

【问题讨论】:

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


    【解决方案1】:

    最后我能够解决它。我只是创建一个端点,它首先执行并更新票证状态并将票证 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交给生成器端点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 2022-12-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多