2016-10-10 28 views
0

Flaskを使用して検索バーを実装しようとしていますが、url/searchを入力すると、40530エラーが発生しました。メソッドが許可されていません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メソッドを使用して、だけPOSTsearchコントローラに許可されているので。あなたは

だから基本的に、それはあなたのsearchコントローラを変更する方が良いでしょう

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

UPDATE

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

に変更する必要があります。それはsearch.htmlを使用していないので間違っています。それはPEP-8

+0

おかげで言ったが、私は ' 'GET''を追加するとき、私は今、302エラーを得たとして

@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つのスペースを作ります。 views.pyのindex()が表示されているので、それを追加したばかりです。 – PSNR

+0

302はエラーではありません。これはあなたが 'search'で送るリダイレクトです。 – dirn

+0

ええ、私は** ERR_TOO_MANY_REDIRECTS **を得て、検索バーは検索ページに表示されません – PSNR