【问题标题】:Different types of POST requests in the same route in FlaskFlask中同一路由中不同类型的POST请求
【发布时间】:2017-09-06 02:29:12
【问题描述】:

我想在我的网站上有一个页面,您可以在其中有多个按钮发送不同的 POST 请求来修改我的数据库的某些部分。

目前,只有最上面的 if 语句被执行。如果我尝试底部的两个,我得到:浏览器(或代理)发送了一个该服务器无法理解的请求。

如果我切换它们,它总是最上面的 if 语句被执行。

我做错了吗?有没有更好的方法来做这种事情?

@app.route('/', methods=["GET", "POST"])
@login_required
def homepage():
    if request.method == "POST" and request.form['estimatedCost']:
        _projectName = request.form['projectName']
        _estimatedCost = request.form['estimatedCost']
        _amountAllocated = request.form['amountAllocated']
        conn, cursor = connectDB()
        cursor.execute("INSERT INTO `project` (`name`, `estimatedCost`, `amountAllocated`, `pStatus`, `actualCost`, `estimatedDuration`, `actualDuration`, `costDifference`) VALUES ( '" + _projectName + "', '" + _estimatedCost + "', '" + _amountAllocated + "', 'NOT STARTED', 0, 0, 0, NULL)")
        conn.commit()
        conn.close()
        return redirect('/')
    if request.method == "POST" and request.form['delete']:
        _delete = request.form['delete']
        conn, cursor = connectDB()
        cursor.execute("DELETE FROM project WHERE name = '" + _delete + "'")
        conn.commit()
        conn.close()
        return redirect('/')
    if request.method == "POST" and request.form['pid']:
        _pid = request.form['pid']
        _status = request.form['status']
        conn, cursor = connectDB()
        cursor.execute("UPDATE project SET pStatus = '" + _status + "' WHERE name = '" + _pid + "'")
        conn.commit()
        conn.close()
        return redirect('/')
    conn, cursor = connectDB()
    cursor.execute("SELECT * FROM project")
    projects = cursor.fetchall()
    conn.close()
    return render_template("dashboard.html", projectDic = projects)

【问题讨论】:

  • 首先,所有三个 if 语句都包含这个 if request.method == "POST" 部分,所以我会将它作为顶级 if 语句并使用 if、elif、elif 检查其中的其他三个条件。此外,您使用request.form['estimatedCost'] 检查的是该表单具有具有真实值的键...但是您应该同时确认所有三个值是什么(通过打印语句或日志语句),因为它们都可能是同时真实。这可以解释为什么只有最上面的条件有效。
  • @JacobIRR 我在分离的模态(引导程序)中有三种形式,因此用户不可能以多种形式输入。
  • 检查上面的语句是否有真值。如果确实如此并且是真的,那么这就解释了为什么只有顶层语句有效
  • 我认为问题可能出在您打算发布到第二个 if 上。第一个 if 仍然会尝试检查不存在的estimatedCost 并导致错误
  • @Bobby 您将如何检查 request.form['estimatedCost'] 字段是否已填写?

标签: python mysql post flask


【解决方案1】:

我设法找到了解决问题的方法。

因为request.form['key'] 在不存在的情况下会导致错误,而不是仅仅变为 False,而是使页面崩溃。

相反,我使用"key" in request.form 来检查该输入是否已填写在表单中。

以下是更正后的代码:

@app.route('/', methods=["GET", "POST"])
@login_required
def homepage():
    if request.method == "POST" and "estimatedCost" in request.form:
        _projectName = request.form['projectName']
        _estimatedCost = request.form['estimatedCost']
        _amountAllocated = request.form['amountAllocated']
        conn, cursor = connectDB()
        cursor.execute("INSERT INTO `project` (`name`, `estimatedCost`, `amountAllocated`, `pStatus`, `actualCost`, `estimatedDuration`, `actualDuration`, `costDifference`) VALUES ( '" + _projectName + "', '" + _estimatedCost + "', '" + _amountAllocated + "', 'NOT STARTED', 0, 0, 0, NULL)")
        conn.commit()
        conn.close()
        return redirect('/')
    if request.method == "POST" and "delete" in request.form:
        _delete = request.form['delete']
        conn, cursor = connectDB()
        cursor.execute("DELETE FROM project WHERE name = '" + _delete + "'")
        conn.commit()
        conn.close()
        return redirect('/')
    if request.method == "POST" and "pid" in request.form:
        _pid = request.form['pid']
        _status = request.form['status']
        conn, cursor = connectDB()
        cursor.execute("UPDATE project SET pStatus = '" + _status + "' WHERE name = '" + _pid + "'")
        conn.commit()
        conn.close()
        return redirect('/')
    conn, cursor = connectDB()
    cursor.execute("SELECT * FROM project")
    projects = cursor.fetchall()
    conn.close()
    return render_template("dashboard.html", projectDic = projects)

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2014-03-16
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多