2016-10-10 56 views
0

我想用Flask实现搜索栏,但是当我输入url/search时,出现了405错误,方法不允许Flask应用搜索栏

这是我的代码片段。任何帮助,将不胜感激!

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 %} 

回答

2

由于当手动您使用GET方法加载网页,但仅POST被允许用于search控制器。您需要更改

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

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

UPDATE

所以基本上这是更好地改变你的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

+0

感谢说,但是当我加''GET'',我现在得到302错误。在views.py中看到index()可能会有所帮助,因此我只是添加了它 – PSNR

+0

302不是错误。这是您在“搜索”中发送的重定向。 – dirn

+0

是的,但我得到** ERR_TOO_MANY_REDIRECTS **和搜索栏不会显示在搜索页面 – PSNR