Flask和Python如何为MySQL数据库数据制作搜索引擎

7 投票
1 回答
21738 浏览
提问于 2025-04-18 05:41

我想做一个搜索引擎,可以通过输入学生的名字来查找他们的信息,使用的是HTML输入框。不过,我的代码遇到了一些问题。我是用Flask和Python来做这个项目的。

这是我的project.py代码:

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == "POST":
        db = MySQLdb.connect(user="root", passwd="", db="cs324", host="127.0.0.1")
        c=db.cursor()
        c.executemany('''select * from student where name = %s''', request.form['search'])
        for r in c.fetchall():
            print r[0],r[1],r[2]
            return redirect(url_for('search'))
    return render_template('search.html')

这是我的search.html代码:

{% extends "hello.html" %}
{% block content %}
<div class="search">
<form action="" method=post>
    <input type=text name=search value="{{ request.form.search}}"></br>
    <div class="actions"><input type=submit value="Search"></div>
</form>
</div>
{% for message in get_flashed_messages() %}
<div class=flash>
    {{ message }}
</div>
{% endfor %}
{% endblock %}

当我点击搜索按钮时,什么也没有发生。我检查了数据库,里面有一些数据,所以不是空的。我找不到我哪里出错了,请帮帮我?

1 个回答

11

确保操作指向正确的链接

我觉得你在渲染表单时,提交表单的链接设置错了。

你现在的版本使用的是 action="",我猜应该改成 action="/search"

所以你的模板需要改成这样:

{% extends "hello.html" %}
{% block content %}
<div class="search">
<form action="/search" method=post>
    <input type=text name=search value="{{ request.form.search}}"></br>
    <div class="actions"><input type=submit value="Search"></div>
</form>
</div>
{% for message in get_flashed_messages() %}
<div class=flash>
    {{ message }}
</div>
{% endfor %}
{% endblock %}

不要把结果重定向到其他地方

你现有的代码在处理POST请求时,第一轮就返回了 redirect

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == "POST":
        db = MySQLdb.connect(user="root", passwd="", db="cs324", host="127.0.0.1")
        c=db.cursor()
        c.executemany('''select * from student where name = %s''', request.form['search'])
        for r in c.fetchall():
            print r[0],r[1],r[2]
            return redirect(url_for('search')) # <- Here you jump away from whatever result you create
    return render_template('search.html')

要渲染你的模板以显示最终报告

你的代码在处理POST请求时,没有显示出任何尝试去渲染你在数据库中找到的内容。

与其用 print r[0], r[1]...,你应该调用 render_template()

大概是这样的:

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == "POST":
        db = MySQLdb.connect(user="root", passwd="", db="cs324", host="127.0.0.1")
        c=db.cursor()
        c.executemany('''select * from student where name = %s''', request.form['search'])
        return render_template("results.html", records=c.fetchall())
    return render_template('search.html')

撰写回答