WTForms возвращает None, только если введены символы меньше 3 - PullRequest
1 голос
/ 20 января 2020

Итак, я делаю веб-страницу с 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-символьные слова.

1 Ответ

0 голосов
/ 22 января 2020

Оказывается, причина проблемы в том, что ответ на запрос базы данных слишком велик, чтобы его можно было передать в session['books'].

Я думаю, что одним из решений было бы вызвать запрос к базе данных в app.route("/results") вместо app.route("/search"). Если у кого-то есть идеи, поделитесь ими.

...