python - 在 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 %}
非常感谢!
解决方案
我看到2个问题。
在 '/search_results/' 路线上,从未定义 form.search.data。由于您将其作为 url 参数包含在内,因此您可以直接在 sqlalchemy 查询中引用“查询”。
您查询的过滤器子句当前是:
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_
推荐阅读
- java - 如何在 facebook 受众网络插页式广告中设置点击计数器?
- python - 用 cv2.HoughCircles 检测外圆的困难
- kubernetes - 如何将密钥从 Vault 注入 Kubernetes pod
- unicode - .txt 这些天预计会采用 UTF-8 编码吗?我必须以 .utf8 结尾吗?
- laravel - 在相关表laravel 6中使用带有密码的护照登录
- virtualbox - VirtualBox 落后于 4k 显示器
- excel - 尽管使用不同的方法在vba中剪切和粘贴相同的单元格,但输出不同?
- python - Python 中 cmp() 的复杂性是什么?
- python - pandas 表达式中带有格式修饰符的 F 字符串在 Series.__format__ 中触发 TypeError
- c++ - pthread_join 期间的分段错误