首页 > 解决方案 > 在 Flask 中创建全文搜索

问题描述

我正在尝试在烧瓶中实现全文搜索,但没有发生任何事情,回溯中没有任何内容,并且 Web 应用程序继续工作。拜托,你能告诉我,我应该在哪里做一些更正,我第一次尝试意识到这一点,以前没有这样的经验。

事件\forms.py

class SearchForm(FlaskForm):
    query = StringField('search', validators=[DataRequired()], render_kw={"class": "form-control"})
    submit = SubmitField('Submit', render_kw={'class': 'btn btn-secondary border-0'})

事件\models.py

class Event(db.Model):
    __searchable__ = ['title', 'description']
    __table_args__ = {'extend_existing': True} 
    id = db.Column(db.Integer, unique=True, primary_key=True)
    title = db.Column(db.String(50), nullable=False)
    genre = db.Column(db.String(100), nullable=True)
    url = db.Column(db.String(100), unique=True, nullable=False)
    date_start = db.Column(db.Date, nullable=True)
    date_finish = db.Column(db.Date, nullable=True)
    description = db.Column(db.String(150), nullable=True)
    place = db.Column(db.String(50), nullable=True)
    address = db.Column(db.String(100), nullable=True)
    price = db.Column(db.String, nullable=True)
    img_url = db.Column(db.String(100), nullable=True)
    text = db.Column(db.Text, nullable=True)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    category = db.relationship('Category', backref='events')
    resource_id = db.Column(db.Integer, db.ForeignKey('resource.id'))
    resource = db.relationship('Resource', backref='events')

事件\views.py

@blueprint.before_request
def before_request():
    g.search_form = SearchForm()

@blueprint.route('/search', methods = ['POST'])
def search():
    if not g.search_form.validate_on_submit():
        return redirect(url_for('event.index'))
    return redirect(url_for('event.search_results', query = g.search_form.search.data))

@blueprint.route('/search_results/<query>')
def search_results(query):
    search_str = f"%{form.search.data}%"
    results = Event.query.filter(Event.name.ilike(search_str), Event.description.ilike(search_str))
    return render_template('event/search_results.html',
        query = query,
        results = results)

事件\search_results.html

<!-- extend base layout -->
{% extends "base.html" %}

{% block content %}
{% if results %}
    <h3>Here are some results</h3>
    
        {% for result in results %}
            <a href="{{ url_for('event.search_results') }}" class="list-group-item">{{ result }}</a>
        {% endfor %}
    
{% endif %}

{% endblock %}

非常感谢!

标签: pythonflask

解决方案


我看到2个问题。

  1. 在 '/search_results/' 路线上,从未定义 form.search.data。由于您将其作为 url 参数包含在内,因此您可以直接在 sqlalchemy 查询中引用“查询”。

  2. 您查询的过滤器子句当前是: filter(Event.name.ilike(search_str), Event.description.ilike(search_str)) 转换为名称描述都类似于 search_str。我假设您真正要查找的是名称描述,例如 search_str。

如果是这种情况,您可以使用“或”子句包装过滤器。 filter(or_(Event.name.ilike(search_str), Event.description.ilike(search_str))) https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.expression.or_


推荐阅读