如何在Flask中的网页上阅读用户输入

时间:2019-04-19 23:11:29

标签: python python-3.x matplotlib flask

我正在尝试创建一个基本的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端点进行呈现感到困惑。如果有人可以详细说明,我将不胜感激。前端不是我的强项。谢谢!

2 个答案:

答案 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