Flask中的jQuery自动完成功能

时间:2016-01-10 11:46:55

标签: javascript jquery ajax flask autocomplete

无法使jQuery自动完成小部件与Flask框架一起使用。 (http://jqueryui.com/autocomplete/#remote这里有一个例子)
manage.py 中,我得到了以下内容:

@app.route('/autocomplete', methods=['GET'])
def autocomplete():
    results = []
    search = request.args.get('autocomplete')
    for mv in db_session.query(Movie.title).filter(Movie.title.like('%' + str(search) + '%')).all():
        results.append(mv[0])
    return jsonify(json_list=results) 

我的 index.html 文件:

    <head>
    ...
    <link href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
    <script src="../static/js/jquery.js"></script>
    <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>


    <script type="text/javascript">
    $(function() {
        $.ajax({
            url: '{{ url_for("autocomplete") }}'
            }).done(function (data) {
                $('#autocomplete').autocomplete({
                    source: data.json_list,
                    minLength: 2
                });
            });
        });
    </script>
    ...
    </head>
    <body>
    ...
       <div>
          <input name="autocomplete" type="text" id="autocomplete" class="form-control input-lg"/>
       </div>
    ...
    </body>

看起来firefox中的dev工具不会返回任何错误。 终端返回以下内容:

  

“GET / autocomplete HTTP / 1.1”200 - “GET / HTTP / 1.1”200 - “GET   /static/css/bootstrap.css HTTP / 1.1“304 -
”GET /static/js/jquery.js   HTTP / 1.1“304 -

小部件不起作用。由于我不太了解jQuery,我无法弄清楚导致问题的原因。请有人帮帮我吗?

1 个答案:

答案 0 :(得分:17)

下面是JS / jQuery和Flask代码:

@app.route('/autocomplete', methods=['GET'])
def autocomplete():
    search = request.args.get('q')
    query = db_session.query(Movie.title).filter(Movie.title.like('%' + str(search) + '%'))
    results = [mv[0] for mv in query.all()]
    return jsonify(matching_results=results)

HTML / jQuery的:

<head>
<link href="//code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
<script src="//code.jquery.com/jquery-2.2.0.min.js"></script>
<script src="//code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>

<script type="text/javascript">
$(function() {
    $("#autocomplete").autocomplete({
        source:function(request, response) {
            $.getJSON("{{url_for('autocomplete')}}",{
                q: request.term, // in flask, "q" will be the argument to look for using request.args
            }, function(data) {
                response(data.matching_results); // matching_results from jsonify
            });
        },
        minLength: 2,
        select: function(event, ui) {
            console.log(ui.item.value); // not in your question, but might help later
        }
    });
})

</script>
</head>
<body>
    <div>
        <input name="autocomplete" type="text" id="autocomplete" class="form-control input-lg"/>
    </div>
</body>

按顺序解释一下:'q'是jQuery的$ .getJSON ajax调用中定义的搜索词参数名。将其传递给烧瓶,然后使用request.args.get进行拾取。从中构造数据库查询,并使用列表推导来构造结果。请注意,对于列表推导,您不会初始化列表,也不会使用for + append组合;一条优雅的线条可以做到一切。

接下来,jsonify返回包含为字典的列表results,其中键matching_results包含结果列表。不要试图使用json.dumps将列表返回给您的ajax调用。请参阅here why(TL / DR:安全问题)。

另请注意,我故意更改了一些变量名称,以便您可以告诉哪个script / flask函数'看到'哪个变量。例如,ajax调用没有看到列表results,它看到matching_results。这就是内部(现在是javascript的)data对象。

要获取列表matching_results是关键,请使用附加脚本中的模式。它比简单地发送一个列表更麻烦,但更安全,最终将允许你使用JS / jquery在客户端做更复杂的事情。

最后,select选项将用户的选择打印到开发者控制台,仅供参考,以便您可以实际响应用户的选择。

有关更完整的jquery-autocomplete示例,请参阅“使用AJAX加载数据”部分here