python - 仅当输入少于 3 个字符时,WTForms 返回 None

标签 python python-3.x flask flask-wtforms

所以我正在使用 Flask 制作一个网页,并使用 WTForms 从搜索栏获取输入。 如果我搜索 4 个或更多字符的任何内容,效果很好(“King”、“Love”、“hate”...等) 如果我搜索任何小于 4 的内容(“as”、“for”、“the”...等),我会从 forms.search.data 得到“None” ,除非我使用 ISBN 进行搜索,然后我可以使用 3 个或更多字符进行搜索,但不能少于 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:

使用 VSCode 调试后,在 return redirect(url_for('results')) 下断点在app.route("/search")form.search.data 的值和session['books']是正确的。 看来session['books']没有被传递到app.route("/results") 。也许是因为数据库响应太大?因为当我搜索 4 个字符的单词时,该应用程序运行良好。

最佳答案

事实证明,问题的原因是数据库查询响应太大,无法传递到 session['books'] 中。

我想一种解决方案是在 app.route("/results") 中调用数据库查询,而不是 app.route("/search") 。 如果有人有任何其他想法,请分享。

关于python - 仅当输入少于 3 个字符时,WTForms 返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59830371/

相关文章:

python - 如何为 numpy 矩阵生成干净的 x 和 y 轴?

python - Tkinter 事件处理程序无法查看全局变量

python - Reportlab platypus - 禁用表拆分

Python list.clear 复杂性

python - 与 pytest.raises(Exception) 不适用于 Flask app.post

python - Python 中的二维插值

python - 如何检查一个序列是否可以变成回文

python - 使用 re.match 或 re.search 返回多个匹配项

python - 我需要在 waitress 提供的 Flask api 中使用多重处理,如何实现?

python - jinja2 + 重构标记