【问题标题】:Flask and Python how to make search engine for data from mysql databaseFlask 和 Python 如何为 mysql 数据库中的数据制作搜索引擎
【发布时间】:2014-06-24 15:47:13
【问题描述】:

我想通过在 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 %}

当我点击搜索按钮时没有任何反应,我检查了数据库中是否有一些数据,所以它不是空的,我找不到我在哪里犯了错误,请帮忙?

【问题讨论】:

  • 您检查浏览器的错误控制台了吗?如果在地址栏中输入&lt;your_hostname&gt;/search 会发生什么?
  • 是的,我什至尝试放置 app.run(debug=True) 但它没有显示任何内容,看起来它只是刷新了 search.html 页面。
  • @SrdjanRistic 单击按钮时,您是否在 Web 应用访问日志中看到任何条目?它声明了什么网址?然后,如果它到达您期望的 url。
  • 它显示:localhost:5000/search 就是这样。当我删除重定向到搜索页面时,它仍然会做同样的事情......
  • 我建议你不要在视图中使用连接相关人员,而是单独为db连接创建一个方法并在应用程序生命周期中保持它,你可以使用flask-sqlalchemy来处理数据库相关的事情

标签: python mysql flask


【解决方案1】:

确保操作指向正确的 url

我认为您在提交表单时使用了错误的action

您的版本使用的是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 分支中显示任何尝试呈现您在数据库中找到的内容。

你应该调用render_template()而不是print r[0], r[1]...

类似的东西

@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')

【讨论】:

  • @SrdjanRistic 我扩展了我的答案,还有另外两个问题 - 您从您在第一次 for 迭代中创建的任何内容中重定向出来。而且您忘记在 POST 返回时呈现结果页面。
  • 为什么request.form() 使用'search' 而不是'/search'?
  • @Pyderman 因为有两个概念,一个是 url 上的路径("/search"),另一个是填写表单的默认值(这是request.form.search)。这些概念含义不同,不得混用。
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多