【问题标题】:Flask app search barFlask 应用搜索栏
【发布时间】:2016-10-10 14:45:31
【问题描述】:

我正在尝试使用 Flask 实现搜索栏,但是当我输入 url/search 时,出现 405 错误,Method Not Allowed

这是我的代码的 sn-p。任何帮助将不胜感激!

forms.py

from wtforms import StringField
from wtforms.validators import DataRequired

class SearchForm(Form):
  search = StringField('search', [DataRequired()])
  submit = SubmitField('Search',
                       render_kw={'class': 'btn btn-success btn-block'})

views.py

from flask_login import login_required
from forms import SearchForm
from models import User

@app.route('/')
def index():
  if current_user.is_authenticated:
    return redirect(url_for('profile'))
  return render_template('index.html')

@app.route('/profile', methods=['GET', 'POST'])
@login_required
def profile():
  # some code to display user profile page

@app.route('/search', methods=['POST'])
@login_required
def search():
  form = SearchForm()
  if not form.validate_on_submit():
    return redirect(url_for('index'))
  return redirect((url_for('search_results', query=form.search.data)))

@app.route('/search_results/<query>')
@login_required
def search_results(query):
  results = User.query.whoosh_search(query).all()
  return render_template('search_results.html', query=query, results=results)

models.py

from flask_sqlalchemy import SQLAlchemy
from flask_whooshalchemy import whoosh_index
from app import app

db = SQLAlchemy()

class User(db.model):
  __searchable__ = ['name']
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(64))

whoosh_index(app, User)

search.html

{% extends 'layouts/base.html' %}
{% set page_title = 'Search' %}
{% block body %}
    <div>
        {{ render_form(url_for('search'), form) }} # note: render_form is some marco from another .html file
    </div>
{% endblock %}

【问题讨论】:

  • 我们能看到宏 .html 文件中的内容吗?
  • 我们可以在嵌套字典中使用同样的方法吗?

标签: python search flask full-text-search whoosh


【解决方案1】:

因为当您手动加载页面时,您使用GET 方法,但search 控制器只允许使用POST。你需要改变

@app.route('/search', methods=['POST'])

@app.route('/search', methods=['GET', 'POST'])

更新

所以基本上最好更换search 控制器。因为它没有使用 search.html 并且工作错误。

@app.route('/search', methods=['GET', 'POST'])
@login_required
def search():
    form = SearchForm()
    if request.method == 'POST' and form.validate_on_submit():
        return redirect((url_for('search_results', query=form.search.data)))  # or what you want
    return render_template('search.html', form=form)

同时缩进 4 个空格,正如 PEP-8 中所说的

【讨论】:

  • 谢谢,但是当我添加 'GET' 时,我现在收到 302 错误。在 views.py 中看到 index() 可能会有所帮助,所以我刚刚添加了它
  • 302 不是错误。这是您在search 中发送的重定向。
  • 是的,但我得到了 ERR_TOO_MANY_REDIRECTS 并且搜索栏不会显示在搜索页面上
  • 谢谢@vishes_shell!现在可以了。我对你的回答做了一些修改。感谢您提醒我 PEP-8,只是我更喜欢 Google 2-space 缩进:p
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多