为什么我的烧瓶页面收到错误请求错误?

时间:2018-05-18 05:36:04

标签: python html forms flask

我在同一页面上有两个烧瓶形式。一个表单在开头可见,用户必须选择一个选项,并根据该表单生成第二个表单。其中包含一个dropdown,它将在onchange事件中提交表单。发生此提交时,我收到错误的请求错误。我的Html表格是:

 <form action="/ip" method="POST" name="btn" value="project">
   <label>Select Project : </label>
   <select class="form-control" style="width: 50%;display:inline-block" name="project_name">
      <option></option>
      <option value="k">Ki</option>
      <option value="s">S</option>
      <option value="l">L</option>
   </select>
   <button type="submit"  class="btn btn-primary m-b-10 m-l-5" style="display:inline-block" ">Fetch Details</button>
</form>
<form method="POST" action="/ip" name="btn" value="dlvr">
   <select id="subsystem_value" onchange="this.form.submit()">
      {% for i in data %}
      {% for k in i %}
      <option value={{ k }}>{{ k }}</option>
      {% endfor %}
      {% endfor %}
   </select>
</form>

我的烧瓶视图是:

@auth.route('/ip',methods = ['POST', 'GET']) 
def ip():
    if request.method == 'POST':
        if request.form['btn'] == "project":
            project = request.form['project_name']
            c, conn = connection()
            subsystem = "SELECT distinct sub from ip where project='{}'".format(project)
            query = "SELECT distinct del from ip where project='{}'".format(project)
            c.execute(query)
            data = c.fetchall()
            c.execute(subsystem)
            subsystem = c.fetchall()
            sub = []
            for row in subsystem:
                for id in row:
                    sub.append(id)
            conn.close() 
            return render_template('ip.html', data=data,sub=sub)
        else:
          subsystem = request.form['subsystem_value']  
          return render_template('ip.html')     
    else:
        return render_template('ip.html')  

我尝试为表单创建相同的名称,并给出了单独的值。但我仍然收到错误的请求错误。

2 个答案:

答案 0 :(得分:1)

我有两个区域,你的错误来自

1)表单名称因HTML 4而被弃用,因此不再提交

if request.form['btn'] == "project":
烧瓶不会理解

解决方法是给你的提交按钮这个名字

<button type="submit" name="project" class="btn btn-primary m-b-10 m-l-5" style="display:inline-block" ">Fetch Details</button>

并在烧瓶视图中,检查这样的表格

if 'project' in request.form:

2)第二个错误就在这一行

<form method="POST" action="/ip" name="btn" value="dlvr">
   <select id="subsystem_value" onchange="this.form.submit()">

第二行应该是name= "subsystem_value",而不是id="subsystem_value" 否则将无法理解烧瓶中的这条线

subsystem = request.form['subsystem_value'] 

所以我有这个简化的代码,不再给我一个错误,并以我认为你想要的方式返回值

在烧瓶中

@app.route('/ip',methods = ['POST', 'GET']) #Used @pp.route to match my testing app
def ip():
    if request.method == 'POST':
        if 'project' in request.form:
            project = request.form['project_name']

            return str(project)
        else:
          subsystem = request.form['subsystem_value']  
          return str(subsystem)     
    else:
        return render_template('test.html')  
模板中的

<form action="/ip" method="POST"  >
   <label>Select Project : </label>
   <select class="form-control" style="width: 50%;display:inline-block" name="project_name">
      <option></option>
      <option value="k">Ki</option>
      <option value="s">S</option>
      <option value="l">L</option>
   </select>
   <button type="submit" name="project" class="btn btn-primary m-b-10 m-l-5" style="display:inline-block" ">Fetch Details</button>
</form>
<form name method="POST" action="/ip" >
   <select name="subsystem_value" onchange="this.form.submit();">
      <option value="test1">t1</option>
      <option value="test2">t2</option>
      <option value="test3">t3</option>

   </select>
</form>

希望能帮到你

答案 1 :(得分:0)

您可以充分利用Flasks调试工具,您可以通过设置环境变量FLASK_DEBUG=1或将debug=True传递给app.run()来激活它。

请参阅http://flask.pocoo.org/docs/1.0/api/#flask.Flask.debug

此外,如果此代码有可能面临恶意用户,请使用SQL绑定变量,而不是从不受信任的输入构建查询。 SQL注入攻击可能会破坏你的一天。