【发布时间】: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'] 字段是否已填写?