将两个函数缩减为一个函数。烧瓶

Reduce Two Functions to a Single Function. Flask

我正在开发一个使用 Flask 在已读和未读消息之间切换的模块。我有一个按钮,可以在阅读和未读我已经实现的消息之间切换。但是我已经尝试编写将其作为单个函数处理的方法,但我没有成功

这是两条路线:

我会省略路由线

def read(msg_id):
    msg = Messages.query.filter_by(id=msg_id).first()

    msg.status = True
    db.session.commit()

    return redirect(redirect_url())

def unread(msg_id):
    msg = Messages.query.filter_by(id=msg_id).first()

    msg.status = False
    db.session.commit()
    
    return redirect(redirect_url())

消息默认为False,表示未读消息。

然后在我的模板上执行此操作;

                {% if msg.status == False %}
                <th scope="row"> <i class="bi bi-bell-fill text-danger"></i> </th>
                {% else %}
                <th scope="row"> <i class="bi bi-check2-circle text-success"></i> </th>
                {% endif %}

如何将以上两个函数重写为一个?

您想切换状态,因此将其设置为不是的值。

def toggle_read(msg_id):
    msg = Messages.query.filter_by(id=msg_id).first()

    msg.status = not msg.status
    db.session.commit()
    
    return redirect(redirect_url())

但是,在实践中,如果它在两个选项卡中打开,或者有两个人在查看状态,或者存在网络错误,这可能会导致 UI 混淆。这是因为 toggle 不是幂等的(幂等应用两次与应用一次相同)。

另一个选项是它为新状态获取一个参数:

def set_read(msg_id, status):
    msg = Messages.query.filter_by(id=msg_id).first()

    msg.status = status == "True"
    db.session.commit()
    
    return redirect(redirect_url())