烧瓶从自动完成传递选定的值并执行 SQL 查询以打印结果

Posted

技术标签:

【中文标题】烧瓶从自动完成传递选定的值并执行 SQL 查询以打印结果【英文标题】:Flask passing selected value from autocomplete and do SQL query to print the result 【发布时间】:2017-12-14 13:14:24 【问题描述】:

我是 Flask(和 Web 开发)的新手,我正在尝试从自动完成中获取选定的值并将该值传递给 SQL,最后在 html 上打印表格。

这是我的 html 中的 javascript

<head>
<script type="text/javascript">
$(function() 
    $("#autocomplete").autocomplete(
        source:function(request, response) 
            $.getJSON("/autocomplete",
            q: request.term,
            , function(data) 
            response(data.matching_results);
            );
        ,
        minLength: 2,
        select: function(event, ui) 
            alert( "You selected: " + ui.item.label );
            console.log(ui.item.value);
        
    );
)

</script>
</head>

<body>
<div>
<form class="form-horizontal" method="post" action="/showSelection">
    <h3>Genes</h3>
    <input name="autocomplete" name="inputGene" type="text" placeholder="Gene name" id="autocomplete" class="form-control input-lg"/ >
</form>
</div>
</body>

在我的 app.py 中(到目前为止我想出了什么,(自动完成部分正在工作,但我不确定如何获取值并使用该值来查询 SQL)

@app.route('/autocomplete', methods=['GET', 'POST'])
def autocomplete():
    czz = mysql.connect()
    cursor=czz.cursor()
    search = request.args.get('q')
    query = ("SELECT Symbol from drugs where Symbol like '%"+search+"%'")
    cursor.execute(query)
    symbols = cursor.fetchall()
    # query = metadata.query(drugs.Symbol).filter(drugs.Symbol.like('%' + str(search) + '%'))
    results = [mv[0] for mv in symbols]

    return jsonify(matching_results=results)
    czz.close()
    cursor.close()

@app.route('/showSelection', methods=['POST'])
def showSelection():
    pd.set_option('display.max_colwidth', -1)
    _Gene = request.form.get('inputGene')
    # _Gene = request.form['inputGene']
    _Gene = str(_Gene)
    print str(_Gene)
    conn = mysql.connect()
    cursor = conn.cursor()
    query=("SELECT * from tbl_wish where gene_name = %s")%(_Gene)
    cursor.execute(query)
    variant=cursor.fetchall()
    print variant

    vas_dict=[]
    for vas in variant:
        vaf_dict = 
          'Gene':vas[1],
          'Literature':vas[2],
          'Variant':vas[3],
          'Description':vas[4]
         
         vas_dict.append(vaf_dict)
         variants = pd.DataFrame(vas_dict)
         variants = variants[['Gene','Literature','Variant','Description']]
         #print variants

    return render_template('listVariants.html', tables=[variants.to_html(index=False)], titles=["Variant list"])
    cnn.close()
    cursor.close()

感谢任何帮助!

【问题讨论】:

你能把你的路线发给/autocomplete吗? @Adam,更新为 /autocomplete 路线 嗨亚当,自动完成部分正在工作,但我不确定如何获取值并使用该值查询 SQL 首先你需要将关闭mysql连接和光标移动到return语句的上方。 return 语句之后什么都没有实际执行。您应该在连接之前关闭光标。 ***.com/a/17665827/3990806 另外,您不需要在自动完成路线上使用 'POST' 方法。 【参考方案1】:

自动完成

@app.route('/autocomplete', methods=['GET'])
def autocomplete():
    conn = mysql.connect()
    cursor = conn.cursor()
    search = request.args.get('q')
    query = ("SELECT Symbol from drugs where Symbol like '%"+search+"%'")
    cursor.execute(query)
    symbols = cursor.fetchall()
    # query = metadata.query(drugs.Symbol).filter(drugs.Symbol.like('%' + str(search) + '%'))
    results = [mv[0] for mv in symbols]
    cursor.close()
    conn.close()

    return jsonify(matching_results=results)

显示路线

@app.route('/showSelection', methods=['GET', 'POST'])
def showSelection():
    gene = request.form.get('inputGene')  # Returns none if not found in request
    if gene is None:
        flash('gene not found')
        return redirect(url_for('selection view'))  # redirect on input
    conn = mysql.connect()
    cursor = conn.cursor()
    query = ("SELECT * from tbl_wish where gene_name = %s")%(gene)
    cursor.execute(query)
    variant = cursor.fetchall()

    vas_dict = []
    for vas in variant:
        vaf_dict = 
          'Gene':vas[1],
          'Literature':vas[2],
          'Variant':vas[3],
          'Description':vas[4]
        
        vas_dict.append(vaf_dict)
    cursor.close()
    conn.close()

    return render_template('listVariants.html', variants=vas_dict)

select.html

<head>
<script type="text/javascript">
$(function() 
    $("#inputGene").autocomplete(
        source:function(request, response) 
            $.getJSON("/autocomplete",
            q: request.term,
            , function(data) 
            response(data.matching_results);
            );
        ,
        minLength: 2,
        select: function(event, ui) 
            alert( "You selected: " + ui.item.label );
            console.log(ui.item.value);
        
    );
)

</script>
</head>

<body>
<div>
<form class="form-horizontal" method="post" action="/showSelection">
    <h3>Genes</h3>
    <input name="inputGene" type="text" placeholder="Gene name" id="inputGene" class="form-control input-lg"/ >
</form>
</div>
</body>

1) 您的输入字段有两个names,而且应该只有一个

2) 您可以从自动完成路由中删除 'POST' 方法,因为它是不必要的

3) 你需要在路由范围内关闭游标和连接,最好是游标然后连接(即在return语句之前)

4) 你的/showSelection 路由需要'GET' 方法。

5) 您不应该依赖 pandas 来格式化您的表格。这就是 Jinja2 的用途。

selection.html

% if variants %
<table>
    <thead>
    <tr>
        <th>Gene</th>
        <th>Literature</th>
        <th>Variant</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    % for variant in variants %
    <tr>
        <td>variant.Gene</td>
        <td>variant.Literature</td>
        <td>variant.Variant</td>
        <td>variant.Description</td>
    </tr>
    % endfor %
</table>
% else %
     <p>There are no results</p>
% endif %

【讨论】:

谢谢亚当,将尝试并发布更新。【参考方案2】:

我根据您的建议修改了我的代码,出于某种原因,来自客户端(自动完成事件)的选定值永远不会传递回服务器端。我做了一些谷歌搜索并将这两行添加到我的选择中:function(

select: function(event, ui) 
            $("#inputGene").val(ui.item.label);
            var getID=ui.item.value;
            return false;
        

它有效。我现在有一个有效的自动完成功能,可以将用户选择的值获取到 sql 并打印到 html 中的表格。

现在我想弄清楚如何从 select: fucntion 中显示警告消息(当用户选择的值不在数据库中时)。目前我可以在 app.py 中完成(通过返回 render_template 一个 erro.html。

最后,我需要使用 pandas 来格式化我的输出,然后再将它们发送到 Jinja 打印表格。否则,字典列表将无法与 Jinja 一起使用。我确信还有其他方法可以做到这一点,但我仍在学习。

感谢指点

【讨论】:

以上是关于烧瓶从自动完成传递选定的值并执行 SQL 查询以打印结果的主要内容,如果未能解决你的问题,请参考以下文章

从 material-ui 自动完成组合框中清除所有选定的值

从 Thymeleaf 下拉列表中获取选定的值

Django ORM查询,不同的值并加入同一张表

在表单之间传递值并从数据库中检索数据

如何使用 Bootstrap Multiselect 获取所有选定的值并在 AJAX 中使用它

尝试使用 jQuery 从选定标签上的选项中获取值并发布到 php 页面