【问题标题】:Why I am getting Bad request error for this flask page?为什么我收到此烧瓶页面的错误请求错误?
【发布时间】:2018-05-18 05:36:04
【问题描述】:

我在同一页面中有两个烧瓶形式。一个表单在开始时是可见的,用户必须选择一个选项并基于该选项生成第二个表单。第二个来自包含一个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')  

我尝试为表单取相同的名称并给出不同的值。但我仍然收到错误的请求错误。

【问题讨论】:

    标签: python html forms flask


    【解决方案1】:

    您的错误来自两个方面

    1) 表单名称自 HTML 4 起已弃用,因此不再提交

    if request.form['btn'] == "project":
    

    flask 不会理解

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

    <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...它给出了错误的请求
    • 在上面的简化代码上,我可以同时提交。可能你可以从答案中的代码开始,然后慢慢添加你的代码,看看错误在哪里
    【解决方案2】:

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

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

    此外,如果此代码有可能遇到敌对用户,请使用 SQL 绑定变量,而不是从不受信任的输入构造查询。 SQL 注入攻击可能会毁了你的一天。

    【讨论】:

    • 它和日志都没有给你任何有用的信息?顺便说一句,我假设您使用的是蓝图。否则,您需要@app.route 而不是@auth.route
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 2017-06-02
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多