以下是有效的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="//pre.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link><script src="//pre.jquery.com/jquery-2.2.0.min.js"></script><script src="//pre.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" /> </div></body>依次进行一些解释:’q’是你的搜索项参数名称,如jQuery的$ .getJSON ajax调用中所定义。这已传递给flask,并使用拾取
request.args.get。据此构造数据库查询,并使用列表推导构造结果。注意,使用列表推导,你不会初始化列表,也不会使用for + append组合;一条优雅的线可以处理一切。
接下来,
jsonify返回
results包装为字典的列表,其中包含
matching_results保存结果列表的键。不要试图将
json.dumps列表返回给你的
ajax调用。见这里为什么(TL / DR:安全问题)。
还要注意,我故意更改了一些变量名,以便你可以告诉哪个脚本/烧瓶函数“看到”了哪个变量。例如,ajax调用看不到列表results,而是看到了
matching_results。那就是里面(现在是javascript的)data对象。
要获取列表matching_results是关键,请使用随附脚本中的模式。它比简单地发送列表更麻烦,但是更安全,最终将允许你使用JS / jquery在客户端执行更复杂的操作。
最后,该
select选项将用户的选择打印到开发者控制台,仅供参考,这样你就可以实际响应用户的选择。



