我正在尝试创建一个基本的Web应用程序,该应用程序在根登录页面上具有HTML表单,然后提交后,使用所需的输入运行postgresql查询,并将用户重定向到具有生成的matplotlib图表的页面他们的投入。在主要功能中,我具有以下功能:
@app.route('/', methods=['POST'])
def main():
return render_template("main.html")
因此,假设我的烧瓶应用程序呈现了我的主要html文件。我在下面有另一条路线:
@app.route('/query', methods=['POST'])
def queryPage():
# code to execute query with information
# passed from the main.html template
# then generate chart via matplotlib via returned information
return render_template("query.html")
我对如何从main.html中的表单获取输入以将信息发送回应用程序以在/ query端点进行呈现感到困惑。如果有人可以详细说明,我将不胜感激。前端不是我的强项。谢谢!
答案 0 :(得分:1)
您需要在main.html上有一个表单...可能是这样(请注意表单操作):
<form action = /query method="POST">
<label for="username">USERNAME:</label>
<input type="text" name="username" id="username" size="15">
<input type="submit" name="submit" id="submit"/>
</form>
当发送该表单时(在用户单击一个按钮后说),烧瓶代码中与该动作(在这种情况下为/ query)匹配的路由将被调用并执行。您的任何表单元素中的name=
变量也将在后端的请求中可用(我以变量username
为例)。您可以这样获得它们:request.form['username']
。其他表单变量(如复选框)将略有不同。
无论如何,您都需要在main.html中某个位置的html中执行/ query操作。...可以通过按钮或定时javascript等调用它。
在main.html上调用此/ query操作时,您需要
return render_template('query.html, username=username)
,然后query.html
页上将提供用户名变量。
请记住,我只传递了一个变量。您可以传递多个变量,列表,字典等...
还请记住,使用Jinja模板可以使您返回到query.html的任何变量都非常动态。您可以遍历列表并打印不同的html标记等,并在html中使用逻辑...可能取决于返回页面的值。
答案 1 :(得分:0)
如果我正确理解了您的问题,那么您就很难将表单信息从主函数传递到单独的queryPage函数进行渲染。通过提供您希望作为关键字参数传递给url_for函数的值,可以轻松实现这一点。然后可以从queryPage函数中的request.args检索这些。鉴于您从此函数返回的是query.html而不是图像,因此,我假设您打算在query.html的img标记内显示图表。在这种情况下,您将需要另一个视图函数来生成并返回图像本身。您可能还需要为此端点禁用浏览器缓存,以防止浏览器将您的动态图片当作静态图片https://stackoverflow.com/a/2068407/10548137处理。
@app.route('/', methods=['GET', 'POST'])
def main():
form = MyForm(request.form)
if request.method == "POST" and form.validate():
return redirect(url_for("queryPage", **form.data))
return render_template("main.html", form=form)
@app.route('/query', methods=['GET'])
def queryPage():
arguments = request.args.to_dict()
image_url = url_for("make_chart", **arguments)
return render_template("query.html", image_url=image_url)
@app.route('/make_chart', methods=['GET'])
def make_chart():
arguments = request.args.to_dict()
# perform postgres query here using arguments
# generate matplotlib chart here using query results
# ? save chart in BytesIO buffer in png format
response = send_file(file_pointer, mimetype="image/png")
# just return response here if don't need to alter headers
response = make_response(response)
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"
return response