Итак, я делаю веб-страницу с Flask и использую WTForms, чтобы получить информацию из панели поиска. Если я ищу что-то, что состоит из 4 или более символов, оно работает нормально («Король», «Любовь», «Ненависть» ... и т. Д. c) Если я ищу что-то, что меньше 4 («как», « для ",", "... et c) я получаю" None "из forms.search.data
, за исключением случаев, когда я ищу с использованием ISBN, тогда я могу искать с 3 или более символами, но не менее.
Код формы:
class SearchForm(FlaskForm):
search = StringField('Search', validators=[DataRequired()])
type = SelectField('Type', choices=[('title', 'Title'), ('isbn', 'ISBN'), ('author', 'Author')])
submit = SubmitField('Search')
Я пытался добавить Length(min=0)
, Length(min=1)
и Length(min=1, max=20)
, но это не помогло.
поиск по коду app.route:
@app.route("/search", methods=['GET', 'POST'])
@login_required
def search():
form = SearchForm()
session['searchresult'] = form.search.data
if form.validate_on_submit():
if form.type.data == 'title':
session['books'] = Book.bsearchtitle(title=form.search.data)
elif form.type.data == 'isbn':
session['books'] = Book.bsearchisbn(isbn=form.search.data)
elif form.type.data == 'author':
session['books'] = Book.bsearchauthor(author=form.search.data)
return redirect(url_for('results'))
return render_template('search.html', title='Search for books', form=form)
Я использую sessions['books']
для передачи данных в результат app.route.
код результата app.route:
@app.route("/results")
@login_required
def results():
sbooks = session['books']
searchresult = session['searchresult']
temp = list()
for b in sbooks:
temp.append(json.loads(b))
books = list()
for t in temp:
books.append(Book(t[0], t[1], t[2], t[3], t[4]))
return render_template('results.html', title='Book search results', books=books, searchresult=searchresult)
Я получаю следующую ошибку от Werkzeug KeyError: 'books'
и указывает на верхнюю часть `` app.route ("/ result").
Дополнительная информация
Если я ищу "king" и получаю результаты , затем я ищу «the». Он переходит на страницу результатов и показывает старые результаты «king», но он говорит мне, что это результаты для «None», поэтому значение, хранящееся в searchresult
, было None
.
Редактировать 1:
Итак, после отладки usi ng VSCode, с точкой останова на return redirect(url_for('results'))
в app.route("/search")
, значения form.search.data
и session['books']
являются правильными. Кажется, что session['books']
не передается в app.route("/results")
. Может быть, потому что ответ базы данных слишком велик? потому что приложение отлично работает, когда я ищу 4-символьные слова.