上一节我们成功将flask框架与MySQL数据库进行连接
意味着我们现在可以利用两者进行很多的操作了。
我最先接触的sql语句是搜索语句,在此我们给自己增加一点难度,实现一个模糊搜索功能。
首先为前端模块
search.html
hello!This is my test for flask!
相信不需要过多解释了,这就是一个很简单的提供搜索框的网页.html文件,将用户输入的值采取post形式,在按了submit之后传入'/search'这个URL中
后端
search.py
首先,让我们一起分享一下在我第一次学习模糊搜索时遇到的一个很有意思的事情。python小白的我在网上查找:python模糊搜索,于是我找到了一个叫做jieba的库。
import jieba
cut_keywords = jieba.cut_for_search(keyword)
于是我应用进了我当时写的的模糊搜索中:
search_result = []
# 取出待搜索keyword
keyword = request.form['keyword']
# 对keyword分词
cut_keywords = jieba.cut_for_search(keyword)
# 遍历所有切分出来的词,搜索数据库
for cut_keyword in cut_keywords:
search_result.extend(sql_query(cut_keyword))
return render_template('search_result.html', search_result=search_result, \
keyword=keyword)
于是,我遇到了一个问题。由于模糊搜索的模糊程度不一,假设在我的数据库中,有一条可被搜索出来的信息叫“啊啊啊啊啊啊啊”,于是,我在输入框中输入“啊”、“啊啊啊”、“啊啊啊啊啊啊啊”,都可以找出这条叫做“啊啊啊啊啊啊啊”的信息。但是由于jieba库对关键词的切割问题,“啊啊啊啊啊啊啊”这个关键词可能被切为:“啊,啊啊,啊啊啊啊,啊啊啊啊啊”这么一些文字,每一个切割的结果都能搜索到信息,所以你的搜索结果其实是用重复的。
怎么办????如何去重???
用集合!
python有一个强大的数据类型叫集合,它可不允许自身存在相同的元素。于是我们往代码中加一条:
search_result = set(search_result)
这个问题就迎刃而解了!
回到正题,我们把这次我们的代码写完:
search_result = []
# 取出待搜索keyword
keyword = request.form['keyword']
# 对keyword分词
cut_keywords = jieba.cut_for_search(keyword)
# 遍历所有切分出来的词,搜索数据库
for cut_keyword in cut_keywords:
search_result.extend(sql_query(cut_keyword)) #sql_query()写在最后
# 记录搜到了多少数据
search_result = set(search_result)
return render_template('search_result.html', result = search_result)
接下来我们再来写一个搜索结果的展示界面:
search_result.html
关键词:{{keyword}}
社团名称
类型
社团介绍
创建者
{% for i in search_result %}
{{i[0]}}
{{i[1]}}
{{i[2]}}
{{i[3]}}
{% endfor %}
由于当时写的是一个学生社团管理平台的项目,搜索的结果设定为社团的名称、类型等,展示界面如上。
总的来说就是将后台的查询结果返回给前端,使得前端可动态构造表格显示结果。
附
sql_query.py
def sql_query(keyword):
sql= "select team_name, category, description, create_user from team where team_name like '%{keyword}%' or category like '%{keyword}%' or description like '%{keyword}%'".format(keyword=keyword)
cursor.execute(sql)
result=cursor.fetchall()
return result