【问题标题】:Posting data from html to flask view using jquery使用 jquery 将数据从 html 发布到烧瓶视图
【发布时间】:2016-12-09 19:02:48
【问题描述】:

我有一个正在使用的下拉菜单。这是HTML

  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
  <script src="{{url_for('static',filename='dropdown_change.js')}}"></script>


 <form action="{{url_for('select_ID')}}" method="POST">
  <label for="input_ID">ID</label>
  <input type="text" />
  <label for="Node_Type">Node_Type</label>
  <select id="dropdown_change">
    <option value=1>Customer</option>
    <option value=2>Phone</option>
    <option value=3>ID_Card</option>
  </select>
<input type='submit' value='Submit'>
</form>

这是我的烧瓶视图:

import db_connect_test
from db_connect_test import Viz_Connector
from flask import Flask, request, session, redirect, url_for, render_template, flash,json,jsonify
import os
app = Flask(__name__)
@app.route('/',methods = ['GET','POST'])
def select_ID():
    if request.method == 'POST':
        ID=request.form['input_ID']
        Node_Type = request.form['Node_Type']
        data = Viz_Connector(ID,Node_type).get_data()
        return  render_template('dropdown.html',data=json.dumps(data))


    return render_template('dropdown.html')

if __name__ == '__main__':
    host = os.getenv('IP','0.0.0.0')
    port = int(os.getenv('PORT',5000))
    app.secret_key = os.urandom(24)
    app.run(host=host,port=port)

这是我的下拉菜单。有一个用于“单击”提交按钮的事件监听器。我认为我是手的方式

    $('input[type=submit]').click(function() {
   var ID = $("#input_ID").val();
   var selectID = $("#dropdown_change").val();
   $.ajax({
     type: "POST",
     url: "/select_ID",

     data: {
       ID: ID,
       Node_Type: selectID  //right way to pass the data to flask?
     },
     success: function(data) {
       alert('SUCCESS: ' + data);
     },
     error: function(xhr, textStatus, errorThrown) {
       document.getElementById('dropdown_change').selectedIndex = 0;
       showMsg('ERROR: ' + errorThrown);
       return false;
     }
   });
   return false;
 });

当我运行它时它失败了:

   400:Bad request

【问题讨论】:

  • @lix URL对应flask中的“select_ID”函数。
  • 我认为您在文本输入中缺少#input_ID。你检查过 JS 控制台的错误吗?
  • 您还需要协调变量名称。最简单的方法是将所有 HTML ID 与发布的表单值匹配。
  • @dana 我认为他们现在和解了,我确实看到了您在答案部分发布的内容,但现在已经消失了。
  • @optimus_prime - 好的,我没有删除我的答案。您可能还有一些额外的事情需要清理,但至少指出了一些问题。

标签: javascript jquery html ajax flask


【解决方案1】:

在将数据发送到服务器之前,您需要对数据进行 url 编码。此外,您的路由不会将POST 拾取到路径/select_ID。你应该发帖到/。一个稍微巧妙的方法是读取 jQuery 中的 action 属性。

HTML:

<form action="{{url_for('select_ID')}}" method="POST">
    <label for="input_ID">ID</label>
    <input id="input_ID" type="text" />
    <label for="Node_Type">Node_Type</label>
    <select id="Node_Type">
        <option value=1>Customer</option>
        <option value=2>Phone</option>
        <option value=3>ID_Card</option>
    </select>
    <input type='submit' value='Submit'>
</form>

JavaScript:

$('input[type=submit]').click(function() {
    var input_ID= $("#input_ID").val();
    var Node_Type= $("#Node_Type").val();
    $.ajax({
        type: "POST",
        url: $(this).closest("form").attr("action"), // read the URL from the form attribute
        data: $.param({ // use $.param() to convert from a JSON object to url-encoded
            input_ID: input_ID,
            Node_Type: Node_Type
        }),
        success: function(data) {
            alert('SUCCESS: ' + data);
        },
        error: function(xhr, textStatus, errorThrown) {
            document.getElementById('Node_Type').selectedIndex = 0;
            showMsg('ERROR: ' + errorThrown);
            return false;
        }
    });
    return false;
});

注意:根据我上面的评论,我协调了 HTML ID 和 JavaScript 变量以使用 input_IDNode_Type,因为这是服务器上所期望的。

【讨论】:

  • 您好,它无法完成“GET”请求并失败:BuildError: Could not build url for endpoint 'index'。您指的是“静态”吗?
  • Hmmm... 也许您毕竟想留在{{url_for('select_ID')}},但保留修改后的 JavaScript 代码。我会更新我的答案。
  • 所以,现在它确实可以工作,但它会转到 url:172.31.179.196:5000/form%20action= 并给出 404 NOT found。理想情况下,它应该与后端数据库连接并呈现图形。我需要确认的是,这是与后端数据库相关的单独错误还是链接的错误?
  • 浏览器被重定向了?这没有任何意义,因为按钮单击事件被取消并且 jQuery 被用于将数据发送到服务器。我也没有看到任何 JavaScript 重定向。您是否尝试过使用 Fiddler 之类的工具检查请求?它可能会让您更好地了解实际发送到服务器的内容以及正在生成的响应。
  • 非常感谢。让它工作。问题在于
【解决方案2】:

尝试改变你的路线:

@app.route('/',methods = ['GET','POST'])
def select_ID():

@app.route('/select_ID',methods = ['GET','POST'])
def select_ID():

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2018-04-05
    • 2017-12-26
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多